super()必须在子类构造函数中调用,否则this未初始化会报错;它激活this并绑定到子类实例,执行父类初始化逻辑,建立正确原型链,是引擎强制的语法约束。

因为子类的 this 在 super() 执行前尚未初始化,直接访问会触发运行时错误。
确保 this 正确绑定到子类实例
ES6 中,new 创建的对象初始是空的,this 还未被赋予任何上下文。父类构造函数负责用属性和方法填充这个空对象,并把 this 绑定到当前正在构建的子类实例上。不调用 super(),this 就始终处于“未激活”状态。
-
super()实际把子类实例作为this传入父类构造函数执行 - 父类中对
this.name、this.id等赋值,最终都落在子类实例上 - 整个过程中
this始终指向子类实例,不是父类实例
强制执行父类初始化逻辑
父类构造函数往往承担关键职责:设置默认状态、校验参数、初始化私有字段、触发生命周期钩子等。跳过 super() 意味着这些逻辑完全被绕过,子类实例可能缺少必要属性或处于非法状态。
- 例如父类要求
id必须为字符串,校验逻辑写在 constructor 里——没调super(id),校验就失效 - React 类组件中不写
super(props),this.props就是undefined - 抽象基类常通过
new.target判断是否被直接实例化,而new.target在父类 constructor 内仍指向子类,依赖super()触发
这是引擎级语法约束,不是可选规范
V8 等引擎在解析子类 constructor 时,会静态检查是否以 super(...) 开头。一旦发现 this 出现在 super() 前,立即抛出 ReferenceError: Must call super constructor before accessing 'this',不给运行机会。
- 错误不是警告,无法捕获或忽略
- 参数必须匹配父类 constructor 签名(如父类要
name,子类就得写super(name)) - 即使父类 constructor 是空的,也必须显式写
super()
super() 不是普通函数调用,而是初始化协议
它不是简单地“执行父类代码”,而是启动一套继承链初始化协议:
- 激活
this,使其可读可写 - 建立正确的原型链:
Child.prototype.__proto__ === Parent.prototype - 为后续
super.method()提供可查找的父类原型基础


















