我正在研究一个类似于通过基于原型的继承创建的类层次结构的web应用程序。我们不断地为一个共同的祖先“类”添加功能,所以它的构造函数签名不断扩展。在Javascript中递归调用“父”构造函数?
每次我们改变祖先的签名时,我们也必须将更改传播给下属的构造函数。这显然是一个可维护性问题,所以我创建了一个函数,用于从arguments
对象中提取父项的参数,并使用Function.apply()
调用父项。
的代码看起来是这样的:
BaseClass.prototype._super = function(args) {
args = Array.prototype.slice.call(args, this.constructor.length);
this.parentConstructor.apply(this, args);
};
像这样使用:
function Child(child_arg1, child_arg2 /*, implicit parent args */) {
this._super(arguments);
}
(我不能使用arguments.caller.arguments
因为代码是严格模式 this.parentConstructor
由功能设置。构建类的层次结构)。
不幸的是,这只适用于一个级别的继承:例如,如果A的父类B有它自己的父类C,当B呼叫_super
时,this.parentConstructor
仍然指向B,这意味着B将最终以无限循环呼叫自己。
如果我将parentConstructor字段与构造函数Functions对象(而不是原型)一起存储,则必须传入当前的调用函数。这将使线路调用超紧密耦合到周围的功能,我试图避免。
因此,有没有人知道任何更好的方法?
你是什么意思“超紧密耦合到周围的功能”?从Child构造函数调用'this._super(Child,arguments)'应该没有问题,是吗? – Bergi 2012-04-27 11:08:27
我只是希望能够将相同的代码行复制并粘贴到所有子构造函数中,而无需对其进行更改。就像我在Java中所做的一样... – 2012-04-27 15:05:45