ES6 中引入了新的关键字extend用以实现继承。算是之前对寄生组合式继承的一个封装。
寄生组合式继承
首先我们来回顾一下寄生组合式继承
1 | function inheritPrototype(subType, superType){ |
如图,精妙之处在于Object.assign。将所有可枚举属性的值从一个或多个源对象复制到目标对象,并将目标对象返回
- 子类继承了弗雷的属性和方法,同时,属性未被创建在原型链上,故不会共享同一属性
- 子类可以给父类动态传参
- 父类的构造函数只执行了一次
Extends
extends关键字主要用于类声明或类表达式中,以创建一个类。该类是另一个类的子类。
其中,constructor表示构造函数。若未显式指定构造方法则会添加默认的constructor
1 | class Rectangle { |
我们在控制台中打印一下square实例:
发现了没有,模式和上边的寄生组合式继承一模一样。
height和width是继承自父类的属性,get area则是从父类继承而来的方法。
其核心实现原理如下
1 | function _inherits(subType, superType) { |
总结
- 通过
class关键字就可以声明一个类,而非像 ES5 中通过function定义 constructor是构造器,相当于继承中的构造函数式继承,通过this.attr定义独属于本实例的属性(已达到互不干扰的效果)- 方法则无需加上
function关键字,直接methodName(){...}即可 extend关键字用于连接父类和子类。class SubType extends SuperType- 而在子类的构造器中则可以通过
super关键字调用父类的构造函数,省去很多不便:super(...args)