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)