【发布时间】:2012-01-21 18:16:24
【问题描述】:
我想为这个“控制器”对象修改构造函数。但是我如何修改构造函数以便我仍然可以调用原始函数?这是我尝试过的。
// 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 如果好奇:en.wikipedia.org/wiki/Monkey_patch 猴子修补属性或方法非常简单,但由于构造函数的特殊状态,我不知所措。您可能是正确的,这是不可能的,但我不确定您所说的原因。我将更新代码示例以反映。
-
告诉我们如何用普通方法猴子路径并不是一个更好的代码示例。这只会让你更难看出你真正的问题是什么。
-
你不能包装构造函数并在创建对象后修改它吗?即定义一个调用保存的旧构造函数的函数,然后对其进行修改并返回新对象。这通常在 python 中使用工厂模式完成。
-
@missingno 真相。再次编辑。