我正在开发一个 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 对象一起存储(而不是在原型中),我将不得不传入当前调用函数。这将使调用的行与我试图避免的周围函数超级紧密耦合。
因此,有人知道更好的方法吗?