一、原型链继承

构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指针。

  1. function Parent1() {
  2. this.name = 'parent1';
  3. this.play = [1, 2, 3]
  4. }
  5. function Child1() {
  6. this.type = 'child1';
  7. }
  8. Child1.prototype = new Parent1();
  9. console.log(new Child1());

虽然父类的方法和属性都能够访问,但其实有一个潜在的问题

  1. var s1 = new Child1();
  2. var s2 = new Child1();
  3. s1.play.push(4);
  4. console.log(s1.play, s2.play);

只改变s1的play属性但是s2的也跟着改变了
image.png
这是因为两个实例使用的是同一个原型对象。它们的内存空间是共享的,当一个发生变化的时候,另外一个也随之进行了变化,这就是使用原型链继承方式的一个缺点