Нет способа изменить прототип функции, чтобы вы могли перехватывать вызовы функции. Самое близкое, что вы собираетесь сделать, это добавить метод, который вы можете вызвать вместо конструктора. Например:
Function.prototype.create = function() {
var obj = new this(); // instantiate the object
this.apply(obj, arguments); // call the constructor
// do your stuff here (e.g. add properties or whatever it is you wanted to do)
obj.foo = 'bar';
return obj;
};
function SomeObject(name) {
this.name = name;
}
var obj = SomeObject.create('Bob');
obj.foo; // => 'bar'
В качестве альтернативы вы можете написать функцию, которую вы бы вызвали для построения конструктора:
Function.makeConstructor = function(fn) {
return function proxyConstructor() {
// check to see if they called the function with the "new" operator
if(this instanceof proxyConstructor) {
var obj = new fn();
fn.apply(obj, arguments);
// do your stuff here (e.g. add properties or whatever it is you wanted to do)
obj.foo = 'bar';
return obj;
} else {
return fn.apply(null, arguments);
}
};
};
var SomeObject = Function.makeConstructor(function(name) {
this.name = name;
});
var obj = SomeObject.create('Bob');
obj.foo; // => 'bar'