问题描述

子类调用父类构造函数时(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中完成

缺点

  • 外界想要初始化只能再新建一个对象

最子级实现类不允许被继承

符合合成复用原则

组合代替继承

  • 不使用继承, 而是使用成员变量来组合父类到子类中

适用范围

  • 仅适用于最子级的实现类,抽象类和接口都不能采用该方案

缺点

  • 当父级链比较长的时候, 调用需要多级嵌套

备选方案

不允许子类重写指定方法

缺点:

  • 子类类似方法名字需要作区分
  • 被禁止重写的方法外界访问不了
指向原始笔记的链接