JS 继承(一)-- 原型链

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

1、原型链

   ECMA-262 把原型链定义为 ECMAScript 的主要继承方式。其基本思想就是通过原型继承多个引用类型的属性和方法。

   构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例,那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。这就是原型链的基本构想。

   /**
    * 父类构造函数
    * name 基础属性
    * hobby 引用属性
    * happy 原型方法
    */
   function Parent(name) {
       this.name = name;
       this.hobby = ['basketball', 'ping-pang', 'reading'];
   }
   Parent.prototype.happy = function() {
       console.log('go to happy');
   }
   /**
    * 子类构造函数
    * 
    */
   function Child(age) {
       this.age = age;
   }
   // 将子类原型指向父类原型的实例
   Child.prototype = new Parent;
   console.log(Child.prototype.constructor) //同样构造函数被改为了 function:Parent
   // 将子类构造函数重新指向Child
   Child.prototype.constructor = Child;
   let c1 = new Child(16);
   let c2 = new Child(18);
   //实例中的引用属性hobby是共享的,如果一个修改了,则其他的也会跟着修改
   c1.hobby[0] = 'play game';
   console.log(c1.hobby); // ['play LOL', 'ping-pang', 'reading']
   console.log(c2.hobby); // ['play LOL', 'ping-pang', 'reading']

   优点:

       共享了父原型方法;

   缺点:

       不能向父构造函数传递参数;

       子类实例共享父类的引用类型(例如:hobby属性);