Web开发人员专业JavaScript中的“寄生组合继承”

时间:2013-06-04 23:55:17

标签: javascript

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/

这真的是一行无用的代码吗?谢谢你的解释!

2 个答案:

答案 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);