Skip to content

Extend 继承

原生构造函数的继承

  • ES5 是先建子类的实例对象 this,再将父类的属性添加到子类上,由于父类的内部属性无法获取,导致无法继承原生的构造函数。
  • ES6 是先新建父类的实例对象 this,然后再用子类的构造函数修饰 this,使得父类的所有行为都可以继承。

所以 ES6 可以实现继承原生的构造函数

ES6

使用 extends 关键字实现继承。与 ES5 相比,会原生继承其父对象的属性与方法,以及静态方法。

super 关键字

子类必须在 constructor 方法中调用 super 方法,否则新建实例时会报错。 说白了,super 就是父类的 this

JS
class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}
class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}

判断一个类是否继承自另一个类的方法

Object.getPrototypeOf 方法可以用来从子类上获取父类。

js
Object.getPrototypeOf(ColorPoint) === Point
Object.getPrototypeOf(ColorPoint) === Point

ES5

ES5 的继承实现方式主要有以下五种,这五种各有优缺点,无法完美实现 extends 的效果

1. 原型式继承

通过构造函数 + 原型对象模拟实现继承。

  • 继承属性:利用 call 改变 this 指向

2. 构造函数继承

3. 组合继承

4. 寄生式继承

5. 寄生组合式继承