必须先调用 super(),因为子类构造函数中 this 的绑定依赖父类构造函数执行,引擎不会自动创建 this,需 super() 完成初始化后才赋予合法值,否则访问 this 会报错。

在 JavaScript 的类继承中,super 关键字用于访问和调用父类的构造函数或方法。要正确初始化子类实例,必须在子类构造函数中第一行调用 super(),否则会报错(ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor)。
为什么必须先调用 super()?
子类构造函数中,this 的绑定依赖于父类构造函数的执行。JavaScript 引擎在子类构造函数开始时不会自动创建 this,而是等待 super() 完成父类初始化后才赋予 this 合法值。跳过或延迟调用 super() 会导致无法使用 this —— 包括设置属性、调用方法等。
如何正确调用 super()?
-
带参数调用:把父类构造函数所需的参数传给
super(),确保父类逻辑正常执行。
例如:class Child extends Parent { constructor(name, age) { super(name); this.age = age; } } -
不传参调用:当父类构造函数无参数或有默认参数时,可写
super()或直接省略参数。
例如:class Animal { constructor() { this.type = "animal"; } }→ 子类中写super()即可 -
不能在 super() 前访问 this:哪怕只是读取
this.xxx,也会触发错误。
错误示例:constructor() { console.log(this.name); super(); }→ 报错
super 还能调用父类的普通方法
在子类的实例方法或 getter/setter 中,可用 super.methodName() 显式调用被重写的父类方法,实现逻辑复用。
例如:sayHello() { return super.sayHello() + " (from child)"; }
注意:此时不需要在方法内部再调用 super() 构造函数,仅限于方法调用。
常见错误与注意事项
- 子类没写
constructor,则隐式存在constructor(...args) { super(...args); },无需手动处理 - 写了
constructor但没写super()→ 直接报错 -
super()写在非首行(如条件判断后、变量声明后)→ 报错 - 箭头函数中没有自己的
super,会沿作用域链向上查找;普通函数中super指向当前类的原型对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











