javascript - js在寄生组合式继承中 寄生函数内的两种创建对象方式有何区别
PHP中文网
PHP中文网 2017-04-11 12:38:37
[JavaScript讨论组]
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; //两者有什么区别

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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
黄舟

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

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

PHPz

问题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的时候不会让子类型再调用一次超类型。
解释的不好,希望对你有所裨益!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号