Web开发人员专业JavaScript,Nicholas C. Zakas撰写的第三版(Wrox,2012,第210-215页,使用以下函数描述“寄生组合继承”:
function inheritPrototype(subType, superType) {
var prototype = object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
我还没有弄清楚prototype.constructor对subType的赋值是做什么的,或者应该做什么。除非我遗漏了某些内容,否则使用示例代码得到的输出是相同的:
在inheritPrototype中没有“augment object”(prototype.constructor = subType;): http://jsfiddle.net/Q22DN/
在inheritPrototype中使用“augment object”(prototype.constructor = subType;) http://jsfiddle.net/eAYN8/
这真的是一行无用的代码吗?谢谢你的解释!
答案 0 :(得分:3)
对“构造函数”的赋值不是强制性的,因为对“原型”的赋值是。这样做的原因是函数原型通常带有默认设置的“构造函数”属性。它可能对复制对象的库很有用,因为你可以从对象本身获得对该对象的构造函数的引用。
function Foo(){
}
obj = new Foo();
console.log(obj.constructor); //function Foo
答案 1 :(得分:2)
Demo 你覆盖了构造函数原型,所以你丢失了SubType.prototype.constructor,如果你想稍后知道对象构造函数,你应该明确地设置它......
function object(o){
function F(){}
F.prototype = o;
return new F();
}
function inheritPrototype(subType, superType) {
var prototype = object(superType.prototype);
prototype.constructor = subType; //if omit (new SubType()).constructor === superType
subType.prototype = prototype;
}
function SuperType(name){
this.name = name;
}
function SubType(name, age){
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(subType, superType);