必须在子类构造函数中调用super(),否则this无法初始化;super()是this初始化的唯一入口,须在访问this前执行并传入匹配参数,否则报错。
必须在子类构造函数中调用 super(),否则 this 无法被初始化,访问或返回都会报错。
super() 是 this 初始化的唯一入口
ES6 的继承机制规定:子类实例的内部结构(包括原型链、内部槽位)必须由父类构造函数完成初始化。引擎会在子类 constructor 开头将 this 置为“未初始化”状态,只有 super() 成功执行后,this 才被正式绑定并可用。
- 即使子类 constructor 为空,只要显式写了
constructor() { },就必须手动调用super() - 如果没写 constructor,ES6 会自动补上:有父类时补
constructor(...args) { super(...args); };无父类时补空构造函数 -
super()不仅执行父类逻辑,还负责设置子类实例的[[Prototype]]指向父类原型
调用 super() 的位置和参数必须准确
super() 必须出现在子类 constructor 中所有对 this 的访问之前,且参数需与父类构造函数签名匹配。
- 错误示例:
console.log(this); super(x, y);—— 访问this在super()前,直接抛ReferenceError - 正确写法:先
super(x, y),再this.color = color或其他操作 - 若父类构造函数需要参数,
super()必须传入对应实参,不能漏传或类型错配
不能跳过 super() 的几种常见误解
有些写法看似绕开了 super(),但实际仍违反规则:
- 写
return {}或return Object.create(...)—— 构造函数返回对象虽可避免this报错,但实例不再继承父类原型,失去继承意义 - 省略 constructor —— 表面没问题,但一旦后续添加 constructor 就必须立刻补
super() - 用箭头函数或普通函数替代 constructor —— class 内部不支持,语法错误
典型正确模式
以继承 Point 创建 ColorPoint 为例:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y); // ✅ 必须第一句
this.color = color; // ✅ this 已就绪
}
}
这样创建的 new ColorPoint(1, 2, 'red') 实例,既拥有 x/y,也拥有 color,且原型链完整指向 Point.prototype。











