不幸的是,在 javascript 中,没有一种简洁的方法可以将参数向上传递到构造函数链,因为构造函数继承自对象,而不是其他构造函数。例如考虑以下内容:
function Person (name) {
this.name = name;
}
function Accountant () {}
Accountant.prototype = new Person('');
现在,如果您想创建一个 Accountant,则没有明确的方法可以为他命名:
var x = new Accountant();
当然,在这个简单的例子中,你可以简单地在创建他之后手动设置他的名字:
x.name = 'Andy';
但现实世界的代码可能并不总是那么容易解决。某些对象在闭包中保持状态,这意味着您无法将参数传递回父对象的构造函数,因为您在定义子对象的原型时已经创建了父对象。
一种解决方法当然是根本不使用继承,而是使用装饰器函数,就像它们是构造函数一样:
function new_person (name) {
var self = {};
self.name = name;
return self;
}
function new_accountant (name) {
var self = new_person(name);
return self;
}
这种设计模式通常被称为寄生继承。请注意,在此设计模式中,我们不使用关键字 new。
如果您仍想使用正确的继承,另一种解决方法是让对象具有init 函数,任何想要继承它的构造函数都可以调用该函数:
function Person (name) {
this.init(name);
}
Person.prototype.init = function (name) {
this.name = name;
}
function Accountant (name) {
this.init(name);
}
Accountant.prototype = new Person('');
当然还有其他更奇特的变通方法。这是 javascript,你只受到你的创造力的限制。但是对于原型继承,init 函数看起来是最简单的解决方法,需要最少的代码,而不需要额外的库或新版本的语言。