有关寄生组合式继承的疑问

今天在《JavaScript高级程序设计》中看到有关寄生组合式继承的代码,有点迷惑,测试的时候的结果又不是我想像的结果,望大神给予指教

这个是书上看到的代码

function SuperType(name){
    this.name = name;
    this.colors = ["red","blue","green"];
}

SuperType.prototype.sayName = function(){
    alert(this.name);
}

function SubType(name, age){
    SuperType.call(this, name);
    this.age = age;
}

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

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function(){
    alert(this.age);
}

我通过在谷歌开发者工具里面测试,发现执行之后

SubType.prototype == SuperType.prototype //true
 

而且两个原型的constructor属性都指向 SubType函数

clipboard.png

有点不理解,javascript中的原型继承是什么样子的,这样的继承方法岂不是把父“类”中的方法也给改变了??

请大神解惑,谢谢

阅读 2.6k
2 个回答
var prototype = Object(superType.prototype);
//这一句,请把它改成
var prototype = object(superType.prototype);
注意object的大小写,它原来object的源码是这样的
function object(o){
    function F(){};
    F.prototype = o;
    return new F(); //注意这里,你这样得到的对象一个临时对象
}
//而
SubType.prototype = object(SuperType.prototype); //实际上是
SubType.prototype = new F(); //所以实际的结构是
SubType.prototype.__proto__ = SuperType.prototype; //形成了原型链,以此达到继承的目的

问题出现在你的 Object 函数,这个应该是 object 函数,是作者自定义的一个函数,相当于 Object.create()Object() 会返回相同的对象。

每个继承的实现方式各有利弊,各自解决了一些问题,又引入一些问题,从这个方向把握比较容易理解。可以参考这个

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题