如何修补对象的构造函数?

时间:2011-12-16 06:11:54

标签: javascript monkeypatching

我想修补这个'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...

2 个答案:

答案 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;
}