原型继承

在 ES6 非常普及的现在,被人突然问到如何使用 ES5 实现原型继承还是真是有点懵。所以特地记下。

ES6

class Animal{
  constructor(){}
}
class Cat extends Animal{
  constructor(){
    super()
  }
}

ES5

function Animal(){
  this.type = 'Animal'
  this.eat = function(){}
}

function inherit(parent,child) {
  const F = function(){}
  F.prototype = parent.prototype
  child.prototype = new F()
  child.constructor = child
}

function Cat(props){
  Animal.call(this,props)
  this.name = 'Cat'
}

inherit(Animal,Cat)

仅使用 call 方法调用 Animal 构造函数并不算实现继承,因为对象的原型是:

new PrimaryStudent() ----> PrimaryStudent.prototype ----> Object.prototype ----> null

所以需要通过一个媒介(一个空函数),将原型链桥接过来,成为:

new PrimaryStudent() ----> PrimaryStudent.prototype ----> Student.prototype ----> Object.prototype ----> null