问题描述
子类调用父类构造函数时(super()), 父类中的this指向子类 当父类构造函数想调用本类方法时,却意外的调用了子类的同名方法
示例
class Father{
constructor(){
this.init()
}
init(){
console.log('father init')
}
}
class Son{
constructor(){
super()
this.init()
}
init(){
console.log('son init')
}
}
//输出:
//son init
//son init原因分析
child::
指向原始笔记的链接
- 即使是父类的构造函数,其中的this是指向子类的
解决方案
child::
针对构造函数的设计
首选方案
非最子级类构造函数中不调用自身函数⭐
- 初始化操作直接在constructor中完成
缺点
- 外界想要初始化只能再新建一个对象
最子级实现类不允许被继承
符合合成复用原则
组合代替继承
- 不使用继承, 而是使用成员变量来组合父类到子类中
适用范围
- 仅适用于最子级的实现类,抽象类和接口都不能采用该方案
缺点
- 当父级链比较长的时候, 调用需要多级嵌套
备选方案
不允许子类重写指定方法
缺点:
指向原始笔记的链接
- 子类类似方法名字需要作区分
- 被禁止重写的方法外界访问不了