子类构造函数中必须第一行调用super(),否则报错且实例无法正确创建;super()执行父类构造逻辑并绑定new.target为子类,确保原型链完整、属性初始化及this可用。

子类构造函数中调用 super() 不是可选项,而是强制要求——它直接决定实例能否正常创建、this 是否可用、原型链是否完整。
必须在第一行调用,且不能晚于 this 访问
只要子类显式定义了 constructor,就必须在函数体最开始调用 super()(或带参的 super(...))。任何在它之前对 this 的读写操作都会触发 ReferenceError:
-
let x = this.name;—— 报错 -
this.name = 'test';—— 报错 -
const temp = 123;—— 允许(变量声明不触碰this)
super() 实际执行的是父类 constructor,并绑定 new.target
它不是简单跳转,而是以当前 new 表达式的目标类(即子类)为 new.target,去执行父类的构造逻辑。这意味着:
- 父类内部若检查
new.target === Parent,结果为false;若检查new.target === Child,结果为true - 如果父类本身也继承自更上层类,
super()会继续向上触发,直到基类(如Object) - 即使父类构造函数为空,也必须写
super(),否则语法报错
参数传递与 this 初始化的关系
super(name, age) 中的参数会原样传给父类构造函数,父类用它们初始化自身属性。这一步完成后,子类实例才真正拥有了父类设定的属性和内部状态:
- 父类中
this.name = name赋值后,该属性就挂载在当前实例上 - 子类后续才能安全地读写
this.name或添加新属性如this.id - 不调用
super(),实例连[[Prototype]]都未正确链接到父类原型
不写 super() 的后果不只是报错,更是语义断裂
JS 引擎不会自动补全或忽略这个步骤。缺失 super() 意味着:
- 子类实例无法获得父类定义的属性和初始化逻辑
- 继承链在构造阶段就中断,
instanceof可能仍成立(因__proto__已设),但行为不可靠 - 即便父类无显式构造函数,子类有
constructor就必须写super(),因为隐式构造器等价于constructor(...args) { super(...args); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











