【发布时间】:2012-04-27 10:38:35
【问题描述】:
我正在开发一个 web 应用程序,它具有类似于通过基于原型的继承创建的类层次结构的东西。我们不断向一个共同的祖先“类”添加功能,因此它的构造函数签名不断扩展。
每次我们更改祖先的签名时,我们还必须将更改传播到后代的构造函数。这显然是一个可维护性问题,所以我创建了一个函数,它从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)应该没问题吧? -
我只是希望能够将同一行代码复制并粘贴到所有子构造函数中,而无需更改它。就像我在 Java 中可以做的一样......
标签: javascript inheritance prototypal-inheritance