是的,子类显式定义constructor时必须第一行调用super(),否则报错;因为super()负责绑定this、设置原型链和激活实例槽位,且不可延迟或条件调用,唯一例外是不声明constructor。

是的,只要子类显式定义了 constructor,就必须在第一行调用 super()(或带参数的 super(args))。这不是可选项,而是 JavaScript 引擎的硬性要求——不调就会立即报错,程序无法继续执行。
为什么必须调用 super()?
因为 super() 不只是“调一下父类”,它承担着关键的初始化职责:
- 为子类实例绑定
this:在super()执行前,this处于“未初始化”状态,任何访问(包括console.log(this)、this.x = 1)都会触发ReferenceError - 设置原型链:把子类实例的
[[Prototype]]正确指向父类的prototype - 激活实例内部槽位:让后续对实例属性的操作合法且安全
哪些情况会出错?
以下写法在 new Sub() 时都会直接失败:
- 写了
constructor() { },但里面没写super() -
super()写在this.name = 'x'后面(顺序错误) -
super()被包在if或try块里(引擎不允许“条件调用”) - 试图在
setTimeout或await后再调用super()(构造函数必须同步完成)
有没有例外?
有,而且只有一种安全绕过方式:
- 子类完全不声明
constructor—— 此时 JavaScript 会自动插入默认构造函数:constructor(...args) { super(...args); } - 一旦你主动写了
constructor,哪怕内容为空,就等于接管了初始化流程,super()就成了不可省略的交接动作
常见误区澄清
别以为“父类构造函数为空就可以跳过 super”——空函数也承担着绑定和初始化责任;也别想用 Parent.call(this) 替代 super(),那是旧式继承写法,在 class 语法下不被允许,会报语法错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











