子类构造函数必须首行调用 super() 且传入父类所需参数,否则报错;未定义 constructor 时会自动插入 super(...args);super 还可用于调用父类方法。

在 JavaScript 的 Class 语法中,子类构造函数必须显式调用 super(),否则会报错(ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor)。这是因为子类实例的 this 必须基于父类初始化后的上下文才能使用。
必须在访问 this 前调用 super()
一旦子类定义了 constructor,就必须在第一行调用 super(),且不能在调用前使用 this(包括读取、赋值、调用方法等)。
- ✅ 正确:super() 在首行,之后才操作 this
- ❌ 错误:this.name = 'xxx' 写在 super() 前 → 报错
- ❌ 错误:super() 被包裹在 if 或 try 中 → 无法保证执行 → 报错
super() 必须传入父类构造函数所需的参数
super() 实际上是调用父类的 constructor。如果父类构造函数需要参数,子类必须把对应参数传进去,否则可能造成父类内部逻辑异常(比如属性未初始化)。
- 父类
class Animal { constructor(name) { this.name = name; } } - 子类需写
super(name),而不是super() - 若漏传,
this.name会是undefined,但不会报语法错误 —— 属于逻辑错误
super() 不仅用于构造函数,还可调用父类方法
在子类的其他方法中(包括构造函数内),可用 super.xxx() 调用父类同名方法。注意:这和 super()(调用父构造器)是两种用法,不要混淆。
- 构造函数里:只能用
super(...)初始化父类 - 普通方法里:可用
super.sayHello()复用父类逻辑 - 不能在箭头函数或静态方法中通过 super 访问实例方法(作用域限制)
不写 constructor 时,super 会被自动插入
如果子类没定义 constructor,JavaScript 会自动添加一个隐式构造函数:constructor(...args) { super(...args); }。此时你无需手动处理,但一旦自定义了 constructor,就必须自己写 super。
- ✅
class Dog extends Animal {}→ 自动继承并转发参数 - ✅
class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } } - ❌
class Dog extends Animal { constructor(name) { this.name = name; } }→ 缺 super → 报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











