super在es6继承中是核心机制而非语法糖,负责实例初始化、原型访问与上下文绑定;子类constructor首行必须调用super()以正确执行父类构造逻辑并绑定this;super.xxx在普通方法中访问父类原型,在静态方法中指向父类构造函数;其使用受严格语义约束以保障继承可预测性。

super在ES6类继承中不是语法糖,而是具有明确语义和运行时行为的核心机制。它直接参与实例初始化、原型访问与上下文绑定,缺一不可。
确保父类构造逻辑正确执行
子类构造函数中必须调用super(),否则无法访问this,会立即抛出ReferenceError。这是因为ES6继承采用“先继承、后实例化”模型:父类构造器必须先运行,把属性挂载到即将生成的子类实例上。
-
super()本质是Parent.prototype.constructor.call(this),父类构造器内的this指向的是子类实例,不是新创建的父类对象 - 若父类构造器接收参数(如
super(name, age)),必须原样传入,否则父类初始化不完整 - 只能在子类
constructor首行调用,提前或延后都会报错
精准访问父类原型上的方法和属性
在子类普通方法中,super.xxx指向父类的prototype,用于安全调用被重写的方法或读取共享属性。
- 调用
super.method()时,该方法内部的this仍指向当前子类实例,便于复用逻辑并保持数据归属清晰 - 不能通过
super访问父类构造器中定义的实例属性(如this.x = 1),因为那些属性不在原型链上 -
super.prop = val实际等价于this.prop = val,赋值目标是子类实例,不是父类原型
支持静态上下文中的父类引用
在子类静态方法中,super指向父类本身(即构造函数),可用于调用父类静态方法或访问静态属性。
- 例如
super.staticMethod()会调用Parent.staticMethod(),且其中this指向子类(非父类) - 这使得多层静态继承链可以逐级向上委托,同时保留子类身份
- 静态方法中无法使用
super(),仅支持属性/方法访问
强制语义约束,防止原型污染与this混乱
super的硬性限制不是限制开发,而是保障继承关系的可预测性:
- 只能在
class内部使用,普通函数或顶层作用域无效 -
super不能单独出现(如console.log(super)),必须带成员访问或调用 -
super.xxx只查父类原型,不继续向上遍历原型链——避免意外覆盖或歧义 - 对象字面量中仅支持方法简写形式使用
super,箭头函数、属性赋值式均不支持











