JavaScript子类构造函数中必须先调用super(),否则报错;super()需在访问this前执行且仅一次,参数须匹配父类构造函数签名,不可在super()前return或throw。

在 JavaScript 中,子类构造函数中必须先调用 super(),否则会报错 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。这是因为子类的 this 依赖于父类构造函数初始化,而 super() 就是触发父类构造逻辑的关键步骤。
必须在访问 this 之前调用 super()
一旦你写了 class Child extends Parent,子类构造函数里只要用了 this(包括读、写、返回 this),就必须先调用 super() —— 且只能调用一次,且不能在 super() 前使用 this。
- ✅ 正确:先
super(),再操作this - ❌ 错误:在
super()前读取this.name或调用this.method() - ❌ 错误:漏掉
super()(即使父类构造函数无参数)
super() 的参数要匹配父类构造函数签名
super(...args) 实际上是在执行 Parent.prototype.constructor(...args)。所以传什么、传几个、类型是否兼容,得看父类怎么定义的。
- 如果父类构造函数接收
(name, age),子类就该写super(name, age) - 如果父类构造函数没有参数(或有默认值),
super()可以不传参,但括号不能省:super()✅,super❌ - 可以加工参数:比如子类多收一个
role,只把前两个传给super(name, age)
不能在 super() 前 return 或 throw
ES2022 起,规范明确禁止在 super() 前 return、throw 或使用 await/yield。这会破坏 this 绑定流程。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:
if (!name) return;写在super()上面 - ✅ 正确:校验逻辑放
super()后,或提前用静态方法/工厂函数处理 - ✅ 替代方案:用静态工厂方法封装校验和实例创建,避开构造函数内复杂逻辑
不继承时不需要 super,继承后必须显式调用
只有 extends 的类才受此限制。普通类或没写 constructor 的子类(会自动获得 constructor(...args) { super(...args); })也隐式满足规则。
- 子类没写
constructor→ 引擎自动注入标准super(...args) - 子类写了
constructor但没调用super()→ 语法错误,无法实例化 - 箭头函数、普通函数、Object.create 创建的对象不受此约束(它们不是 class 子类)


















