es6子类必须先调用super()才能使用this,因为父类构造函数负责初始化实例属性、执行逻辑并确立原型链;super()是this的“激活开关”,不调用会触发referenceerror。

因为子类的 this 对象在底层是由父类构造函数初始化的,没调用 super() 前,this 还未被绑定和激活。
父类负责初始化实例状态
ES6 类继承中,子类实例不是“先创建再继承”,而是“先继承再创建”。父类构造函数承担了关键初始化任务:
- 为实例挂载父类定义的属性(如
this.name、this.id) - 执行父类内部逻辑(如事件绑定、状态校验、私有字段初始化)
- 确保原型链正确就位,使方法能沿
[[Prototype]]查找
super() 是 this 的“激活开关”
super() 不只是调用父类函数,它触发了 JS 引擎的关键流程:
- 把 new 创建的空对象作为
this传入父类构造函数 - 父类构造函数执行后,该对象才真正具备父类结构,
this才被“解锁” - 此时子类才能安全读写
this.xxx或返回该实例
不调用 super() 会直接报错
引擎强制这一规则,错误信息明确指出问题本质:
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor这不是风格建议,而是语言设计层面的安全机制——避免访问一个尚未初始化、结构不完整的 this。
对比 ES5 继承更易理解
ES5 中常写 Creature.call(this, type),逻辑类似:必须先让父构造函数处理 this,再在子构造函数里扩展。ES6 的 super() 把这个显式调用变成语法强制项,防止遗漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











