红皮书继承小结

组合继承

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

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

你可能感兴趣的:(红皮书继承小结)