本篇文章中,主要探究的是有两个方面,一个是ES6之前类的继承方式,一个是ES6类继承与非ES6的区别
ES6之前类的继承方式概览:
- 类继承
- 构造函数式继承
- 组合式继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承
类继承
本质:将子类原型修改为父类实例
缺点:
- 修改来自原型的引用类型属性时,会有副作用:影响所有实例
- 无法传递参数:不能向父类传递构造函数参数
构造函数式继承
本质:在子类构造函数里使用call/apply
来实现继承。盗用继承这个名称可能更贴合
缺点:
- 无法通过instanceOf校验
- 无法调用父类方法及属性:即没有继承到
组合式继承
本质:组合以上两种继承方式(类式继承&构造函数式继承)
组合继承基本解决了最开始两种继承方式的缺点,但是又产生了新的问题:父类构造函数被调用了两次
原型式继承
本质上是对类继承的一种封装,可等价于Object.create
,核心就是借助原型基于已有的对象创建一个新的对象,同时还不必因此创建自定义类型
缺陷:同 类继承
寄生式继承
在原型式继承的基础上进行拓展,本质是依托一个内部对象来生成一个新对象,因此称为寄生
缺陷:修改原型上的引用类型,会同步所有的子类型实例
寄生组合式继承
结合寄生继承与组合式继承,基本解决以上方式的问题
最终达成的效果:
- 子类继承父类的属性和方法,同时,属性也没有被创建在原型链上,因此,多个子类不会共享同一个属性
- 子类可以传递动态参数给父类
- 父类的构造函数只执行了一次
缺陷:子类的方法必须要在继承后编写,否则继承时会被覆盖掉。什么意思呢?接上面的代码举个例子:
可以看到在上面的例子中,定义子类的方法发生在继承前,继承时方法被覆盖了,导致抛出异常。
改进:针对该缺陷,可以改进继承方法
ES6 Class 继承
ES6提供了很方便的定义类的语法糖class
,使开发者可以很快速直观的创建一个类,而不用再去写一堆具有混淆性的function了。ES6的类也提供了很方便的继承方法,那就是关键字extends
,使用如下
既然是语法糖,就有不用class实现类的形式,那么究竟是如何实现呢?我们可以用babel来翻译一下以上例子:
看起来是不是很熟悉,没错,就是寄生组合式继承
文章基于此文章进行分析
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!