6

面向 Web 开发人员的专业 JavaScript,第三版,Nicholas C. Zakas(Wrox,2012 年,第 210-215 页)使用以下函数描述了“寄生组合继承”:

function inheritPrototype(subType, superType) {
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; 
    subType.prototype = prototype; 
}

我还没有弄清楚将 subType 分配给prototype.constructor 做什么或应该做什么。除非我遗漏了什么,否则我使用示例代码得到的输出是相同的:

在inheritPrototype中没有“增强对象”(prototype.constructor = subType;):http: //jsfiddle.net/Q22DN/

在inheritPrototype http://jsfiddle.net/eAYN8/中使用“增强对象”(prototype.constructor = subType;)

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

4

2 回答 2

3

分配给“构造函数”不是强制性的,就像分配给“原型”一样。这样做的原因是函数原型通常带有默认设置的“构造函数”属性。这对于复制对象的库可能很有用,因为您可以从对象本身获取对该对象的构造函数的引用。

function Foo(){
}

obj = new Foo();

console.log(obj.constructor); //function Foo
于 2013-06-05T00:04:14.933 回答
2

演示 您覆盖了构造函数原型,因此您丢失了 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);
于 2013-06-05T00:49:30.347 回答