我想修补这个'Controller'对象的构造函数。但是我如何修补构造函数,所以我仍然可以调用原始函数?这就是我尝试过的。
// original
function Controller() {
this._tag = 'div';
}
Controller.prototype.tag = function() {
console.log(this._tag);
}
var c = new Controller();
c.tag(); // -> 'div', as expected
// patch attempt
var original = Controller;
Controller = function() {
original.apply(this);
this._tag = 'patched'; // patch
}
var c = new Controller();
c.tag(); // no method tag, prototype appears wiped...
答案 0 :(得分:8)
您似乎想要执行以下操作:
Constructor.prototype.oldTag = Constructor.prototype.tag;
Constructor.prototype.tag = function() {/* whatever */};
现在所有实例都会获得新的标记方法,如果您愿意(或将其放回),您仍然可以调用 oldTag 。
或许您想要做类似的事情:
var oldConstructor = Constructor;
var Constructor = function () { /* new constructor */ };
Constructor.prototype = oldConstructor.prototype;
所以现在你有了一个包含所有旧方法的新构造函数。或者做以上两点。只需用简单的英语说出你想做什么。
答案 1 :(得分:2)
更简洁的方法不是对构造函数进行修补:将构造函数逻辑放在单独的init
方法中,然后将猴子补丁/继承。
function Constructor(){
this.init();
}
Constructor.prototype.init = function(){ /*...*/ };
您还可以考虑使用构建器函数构建对象
function make_fancy_obj(){
var obj = new Constructor();
obj.foo = 'bar';
return obj;
}