美文网首页
红皮书继承小结

红皮书继承小结

作者: 雨中追燕 | 来源:发表于2016-11-16 20:38 被阅读6次

    组合继承

    也叫伪经典继承;指将原型链和构造函数技术组合一起的继承方式

    function SuperType(name){
            this.name =name;
            this.colors =["red","blud","green"];
          }
          SuperType.prototype.sayName =function(){
            alert(this.name);
          }
          function SubType(name,age){
            //继承属性
            SuperType.call(this,name);   //第二次调用SuperType()
            this.age =age;
          }
          //继承方法
          SubType.prototype = new SuperType();  //第一次调用SuperType()
          SubType.prototype.construcotr = SubType;
          SubType.prototype.sayAge = function() {
            alert(this.age);
          }
    
          var xyy = new SubType("xyy",21);
          xyy.sayName();  //xyy
          xyy.sayAge();   //21
    
         var xyy2 = new SubType("xyy2",212);
          xyy.sayName();  //xyy2
          xyy.sayAge();   //212
    

    xyy => SubType => SuperType
    SuperType构造函数定义了两个属性:name和colors。SuperType的原型定义了一种方法sayName()。SubType构造函数在调用SuperType构造函数时传入了name参数,也同时定义了自己的属性age。然后将SuperType是实例赋值个SubType的原型,然后又在新的原型上定义方法sayAge()。这样就可以让两个不同的SubType实例分别拥有自己的属性包括colors属性,又可以使用相同的方法

    不足:
    组合继承最大的不足是,无论什么情况下,都会调用两次超类型构造函数,一次是在创建子类原型时,第二次是在构造函数内部

    寄生组合继承

    寄生组合继承是借用构造函数来继承属性,通过原型链混成形式来继承方法

    //替换了第一次调用
    function inheritPrototype(subType,superType){
          var prototype=Object.create(superType.prototype); //创建对象
          prototype.constructor=subType;   //为对象添加constructor属性,弥补重写原型而失去的constructor属性
          subType.prototype=prototype; //将创建的对象赋值给子类的原型
            }
            function SuperType(name){
              this.name =name;
              this.colors =["red","blud","green"];
            }
            SuperType.prototype.sayName =function(){
              alert(this.name);
            }
            function SubType(name,age){
              SuperType.call(this,name);
              this.age =age;
            }
            inheritPrototype(SubType,SuperType);
            SubType.prototype.sayAge=function(){
                   alert(this.age);
            };//扩展出sayAge方法
    
    var person1=new SubType("nUll",25);
    var person2=new SubType("mywei",25);
    person1.colors.push("gay3");
    person1.sayName();
    person1.sayAge();
    console.log(person1.colors);    //["red", "blud", "green", "gay3"]
    console.log(person2.colors);  //["red", "blud", "green"]
    console.log(person1 instanceof SubType);   //true
    console.log(person1 instanceof SuperType);  //true
    console.log(SubType.prototype.isPrototypeOf(person1));  //true
    console.log(SuperType.prototype.isPrototypeOf(person1)); //true
    

    相关文章

      网友评论

          本文标题:红皮书继承小结

          本文链接:https://www.haomeiwen.com/subject/xdyrpttx.html