借助原型链

缺点: 多个实例使用同一个原型对象

      function Parent2() {
        this.name = 'parent2'
        this.play = [1, 2, 3]
      }

      function Child2() {
        this.type = 'child2'
      }
      Child2.prototype = new Parent2()
      
      const c2 = new Child2()
      console.log(c2) // { type: "child2" }
      console.log(c2.name) // parent2
      console.log(c2.play) // [1, 2, 3]
    

看似没有问题,父类的方法和属性都能够访问,但实际上有一个潜在的不足。举个例子:

因为两个实例使用的是同一个原型对象, 所以改变c21的play属性,c22的play属性也跟着变了

      const c21 = new Child2()
      const c22 = new Child2()
      
      c21.play.push(4)
      console.log(c22.play) // [1, 2, 3, 4]
      console.log(c21.play === c22.play) // true