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

Dan*_*nor 10 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...
Run Code Online (Sandbox Code Playgroud)

Rob*_*obG 8

你似乎想做一些事情:

Constructor.prototype.oldTag = Constructor.prototype.tag;

Constructor.prototype.tag = function() {/* whatever */};
Run Code Online (Sandbox Code Playgroud)

现在所有实例都获得了新的标记方法,如果你想要(或者把它放回去)你仍然可以调用oldTag.

或许你想要做的事情如下:

var oldConstructor = Constructor;

 var Constructor = function () { /* new constructor */ };
 Constructor.prototype = oldConstructor.prototype;
Run Code Online (Sandbox Code Playgroud)

所以现在你有了一个包含所有旧方法的新构造函数.或者做以上两点.只需用简单的英语说出你想做什么.