javascript - js在寄生组合式继承中 寄生函数内的两种创建对象方式有何区别
PHP中文网
PHP中文网 2017-04-11 12:38:37
0
3
338
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)
Peter_Zhu

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!