我想猴子修補這個'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...
圍繞RHS函數表達式的分組運算符是多餘的。 「構造函數」是在另一個函數內聲明的,所以你不能從外部訪問它(除非缺少代碼使它成爲外部匿名函數或其他對象的屬性)。所以如果你想要「修補」構造函數(無論這意味着什麼),插入代碼的地方你的評論是唯一的方法。 – RobG 2011-12-16 06:37:12
@RobG如果好奇:http://en.wikipedia.org/wiki/Monkey_patch它非常簡單直接地爲猴子修補一個屬性或方法,但由於構造函數的特殊狀態,我很茫然。你可能是正確的,這是不可能的,但我不確定你說的原因。我會更新代碼示例以反映。 – 2011-12-16 15:03:56
添加了更好的代碼示例。 – 2011-12-16 15:48:28