JS 继承(二)-- 借用构造函数

发布日期:2019-07-04 阅读量:499

   为了解决原型包含引用值导致的继承问题,一种叫作“盗用构造函数”(constructor stealing)的技术在开发社区流行起来(这种技术有时也称作“对象伪装”或“经典继承”)。基本思路很简单:在子类构造函数中调用父类构造函数。

    /**
    * 父类构造函数
    * 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;
   }
   
   let c1 = new Child('aa', 18);
   let c2 = new Child('bb', 16);
   console.log(c1.say === c2.say); //false
   c1.hobby[0] = ['play game'];
   console.log(c1.hobby); // ['play LOL', 'ping-pang', 'reading']
   console.log(c1.hobby); // ['basketball', 'ping-pang', 'reading']
   c1.happy() // undefined

   优点:

       可以向父构造函数传递参数;

       引用类型不共享;

       可以多继承(多个call函数)。

   缺点:

       不能使用父的原型方法(没有用到原型);

       同理不能使用父的原型属性;

       因为引用类型不会共享,所以父在构造函数中定义的方法也不是同一个,而是每个实例单独拥有。