js在寄生组合式继承中 寄生函数内的两种创建对象方式有何区别

function inheritPrototype(subtype,supertype){
  var prototype = Object(supertype.prototype);
  var prototype = supertype.prototype; //两者有什么区别
  prototype.constructor = subtype;
  subtype.prototype = prototype;
}

function SuperType(name){
  this.name = name;
}

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

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

inheritPrototype(Subtype,SuperType);

例子来自于js高程。用手机打得 如有错误还望包涵

问题一 下面的两种创建对象的方式有区别吗?如果有,有什么区别

  var prototype = Object(supertype.prototype);
  var prototype = supertype.prototype; //两者有什么区别

问题二
在例子中 超类与子类的原型是否指向了同一个原型对象?寄生组合继承能否被认为是把组合式继承中本来指向超类实例的原型指针转换成直接指向超类原型,从而达到越过超类构造函数的目的?

阅读 2.9k
4 个回答

问题1的两个没有区别,因为Object作为普通函数调用,内部会自动转为new调用。

问题2这个你理解可能有偏差,首先对于寄生组合式继承,依赖于原型式继承。你仔细看书会发现,你问题一中的代码与书中的不同,书中是object(上面封装过的原型式继承方法),而你写的是Object,这个我也不细说了,你重新看一下书体会一下。

问题1,没有区别,http://www.365mini.com/page/j...
2,指向同一个原型对象,superType.prototype == subType.prototype //true
相对组合继承,其优点就是少调用一次超类构造函数。内存上来说就是原型链上少一层,使用起来是一样的

1.没有区别
2.指向的对象也是同一个,因为inheritPrototype(subtype,supertype)这个函数的目的就是要把超类型的原型副本继承给子类型。只是副本而已,相当于阉割版的超类型原型,子类型不会获得超类型的属性。

如果按照组合式的SubType.prototype = new SuperType(),相当于重写了子类原型,即使你之后再手动的指明constructor指向,在子类的原型上也会得到也许没必要得到的属性。show code:

    function inheritPrototype(subtype,supertype){
            //var prototype = Object(supertype.prototype);
            var prototype = supertype.prototype;
            prototype.constructor = subtype;
            subtype.prototype = prototype;
        }

        function SuperType(name){
            this.name = name;
            this.colors = ["red","white"];
            this.hobby = "travel";
        }

        SuperType.prototype.sayName = function(){
            alert(this.name)
        }
        SuperType.prototype.sayHi = function(){
            alert("hi")
        }
        function SubType(name,age){
            SuperType.call(this,name);
            this.age = age;         
        }
        //inheritPrototype(SubType,SuperType);
        SubType.prototype = new SuperType();
        SubType.prototype.constructor = SubType;
        SubType.prototype.sayAge = function(){
            alert(this.age);
        }
        var insatance1 = new SubType("Nicholas",29);
        SubType.prototype.sayHi();
        alert(SubType.prototype.hobby);
        alert(SubType.prototype.colors);

在这段代码中,最后这两个alert会弹出超类型上的属性值,因此,如果在instance1实例上,获取到一个超类型的属性,那么在子类型上的原型还会调用一次超类型SuperType(),这显然是没有必要的。
采用了寄生组合式继承,子类型根本不会得到这个属性,当instance1调用colors的时候不会让子类型再调用一次超类型。
解释的不好,希望对你有所裨益!

书中inheritPrototype这个方法是这样写的

var prototype = object(supertype.prototype);

注意 是object方法
书中前面有定义了object方法

function object(o) {
    function F(){};
    F.prototype = o;
    return new F();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题