super()是真正完成this绑定的前提,它初始化原型链、设置自有属性并确认引擎级this绑定;省略super()将导致继承链失效,即使父类constructor为空也必须显式调用。

因为子类实例的内部状态和原型链依赖父类构造函数初始化,super() 才是真正完成 this 绑定的前提。
this 在 super() 之前处于“未就绪”状态
JavaScript 引擎在 new 调用过程中,会先创建一个空对象,再将其作为 this 传入子类构造函数。但此时 this 并未与父类逻辑关联——它的 [[Prototype]] 还没被正确设置,内部属性也未初始化。只有执行 super() 后,父类构造函数才会: - 初始化 this 的原型链(指向父类 prototype) - 设置实例自有属性(如父类中 this.name = name) - 完成引擎层面的 this 绑定确认
在此之前访问 this(比如读写属性、调用方法),就会触发 ReferenceError:“Must call super constructor before accessing 'this'”。
super() 不只是执行父类代码,更是建立继承契约
super() 是 class 语法中强制的“继承握手协议”。它不只是运行父类 constructor 函数体,更承担了底层机制职责: - 确保子类实例能正确沿原型链查找父类方法 - 使 instanceof 判断准确(如 obj instanceof Parent) - 支持后续 super.methodName() 的语义一致性
即使父类 constructor 是空的,也必须显式写 super()。省略它,就等于跳过继承链初始化,整个派生关系将失效。
常见误操作与替代方案
想在 super() 前做参数预处理?不能直接写语句,但可以: - 把计算逻辑写成静态方法,直接用于 super() 参数: super(normalize(name)) - 提前校验参数并抛出错误(只要不碰 this): if (!name) throw new Error('name required') - 避免在 super() 前声明变量或打印日志——这些虽不报错,但违背初始化顺序语义
注意:箭头函数无法作为子类构造函数,因为它没有自己的 this 绑定上下文,也无法调用 super()。

















