这是我参与「第四届青训营 」笔记创作活动的第1天
继承模式
原型链继承
过程
- 定义父类型构造函数,给父类型原型添加方法
- 定义子类型构造函数
- new 一个父类型的实例赋值给子类型的原型
- 子类型原型的构造属性设置回子类型函数
- 给子类型原型添加方法
- 创建子类型对象就可以调用父类型方法 关键
- 子类型的原型是父类型的一个实例对象
- 需要重新设置子类型原型的constructor属性
-
- Son.prototype.constructor = Son;
-
- 若不设置,此时会沿着原型链,在父类型原型身上找到constructor属性,这个属性指向Dad构造函数
图示
借用构造函数继承
过程
- 定义父类型构造函数
- 定义子类型构造寒素
- 在子类型构造函数中调用父类型构造
-
- Dad.call(this,xxx)
关键
- 在子类型构造函数中通过super()调用父类型构造函数
组合继承
- 原型继承(继承父类型方法)+ 借用构造函数(继承父类型属性)
原型式继承
优点
- 对一个对象进行浅克隆创建另一个对象,同时继承该对象的原型属性
缺点
- 由于是浅克隆,所以实例共享的对象属性如果是引用值,会受污染。
代码
- 箭头函数不能做构造函数
寄生式继承
核心
- 在原型式继承的基础上,增强对象,返回构造函数
主要作用
- 为构造函数新增属性和方法,以增强函数
缺点(同原型式继承)
- 原型链继承多个实例的引用类型属性指向相同,存在篡改的可能。
- 无法传递参数
寄生组合继承
-
借用构造函数来继承属性 + 原型链的混成形式来继承方法
-
思想
-
- 必为了子类型的原型而调用父类型的构造函数,我们所需的无非是要父类型原型的一个副本而已。本质上就是使用寄生式继承来继承父类型的原型,然后再将结果指定给子类型的原型
-
代码