JS 继承(三)-- 组合继承

发布日期:2019-07-05 阅读量:470

   组合继承(有时候也叫伪经典继承)综合了原型链和盗用构造函数,将两者的优点集中了起来。基本的思路是使用原型链继承原型上的属性和方法,而通过盗用构造函数继承实例属性。这样既可以把方法定义在原型上以实现重用,又可以让每个实例都有自己的属性。

    /**
    * 父类构造函数
    * name 基础属性
    * hobby 引用属性
    * say 引用类型functio
    * happy 原型方法
    */
   function Parent(name) {
       this.name = name;
       this.hobby = ['basketball', 'ping-pang', 'reading'];
       this.say = function() {
           console.log('parent say');
       }
   }
   Parent.prototype.happy = function() {
       console.log('go to happy');
   }
   /**
    * 子类构造函数
    */
   function Child(name, age) {
       Parent.call(this, name); // 第一次调用
       this.age = age;
   }
   
   Child.prototype = new Parent(); 第二次调用
   Child.prototype.constructor = Child;
   
   let c1 = new Child('aa', 18);
   let c2 = new Child('bb', 16);
   console.log(c1.say === c2.say); //true
   c1.hobby[0] = ['play game'];
   console.log(c1.hobby); // ['play LOL', 'ping-pang', 'reading']
   console.log(c1.hobby); // ['basketball', 'ping-pang', 'reading']

   优点:

       可以向父函数传递参数;

       父函数的原型方法可以复用;

       引用类型数据单独拥有。

   缺点:

       由于调用了两次父类的构造函数,会存在多余的一份父类实例属性。