ES6子类必须调用super()才能生成合法this对象,因继承机制是“先继承、后实例化”,super()执行Parent.prototype.constructor.call(this)初始化父类属性,否则访问this会报错。

因为子类实例的 this 对象依赖父类构造函数初始化,不调用 super() 就无法生成合法的 this,直接访问会报错。
子类没有独立的 this,必须靠 super 构建
ES6 的继承机制是“先继承、后实例化”:子类实例本质上是父类实例的增强版。JavaScript 要求先用父类构造函数塑造出基础结构(比如设置 this.name、this.id 等),再由子类添加自己的属性或逻辑。这个塑造过程只能通过 super() 触发——它内部执行的是 Parent.prototype.constructor.call(this, ...),把父类初始化逻辑应用到即将诞生的子类实例上。
如果跳过这步,this 就是未定义状态,哪怕只写 console.log(this) 或 this.age = 25,都会立即抛出:
super() 不只是执行父类代码,它决定 this 是否可用
- 在子类
constructor中,super()必须是第一句(不能放在if或异步回调里) - 调用
super()后,this才被绑定为当前子类实例,后续才能赋值、调用方法、返回 - 即使父类构造函数为空,也必须写
super();否则语法通过,运行时报错 - 如果子类没写
constructor,引擎会自动补一个空的constructor(...args) { super(...args); }
和 ES5 继承的根本区别
ES5 是“先造实例、再塞方法”:用 Object.create(Parent.prototype) 创建空对象,再用 Parent.call(this) 补属性。而 ES6 强制顺序不可逆——必须先让父类“认领”这个实例,再由子类“签字确认”。这种设计让继承关系更严谨,也避免了原型链断裂或属性丢失的风险。
不调用 super 的常见误操作
- 写了
constructor却忘记super()(最常见) - 把
super()写在this.xxx赋值之后 - 误写成
super(无括号),当成变量使用 - 在非构造函数中(如普通方法、getter/setter)调用
super()


















