super在es6中行为取决于上下文:constructor中调用super()执行父类构造逻辑且this绑定子类实例;普通方法中super指向父类原型,用于访问其方法或getter/setter;静态方法中super指向父类构造函数,用于调用静态成员。

super 在 ES6 中不是固定对象,它的行为完全由当前代码所处的上下文决定——是构造函数、普通实例方法,还是静态方法,指向和作用都不同。
在子类 constructor 中:super() 是父类构造器,this 指向子类实例
必须在第一行调用,否则访问 this 会报错;它执行父类构造逻辑,但内部 this 绑定的是正在创建的子类实例。相当于手动写 Parent.prototype.constructor.call(this, ...args)。
- 不传参或参数不匹配,会导致父类初始化失败(如未设 this.name)
- 不能在 constructor 外调用 super()
- super() 后才能给 this 添加属性或返回 this
在子类普通方法中:super 指向父类原型(Parent.prototype)
此时 super 是一个只读引用,用于访问父类定义在 prototype 上的方法或 getter/setter。调用 super.xxx() 时,该方法内部的 this 仍是当前子类实例。
- 无法通过 super 访问父类构造器里挂载的实例属性(如 this.x = 1)
- super.xxx = val 实际等价于 this.xxx = val,修改的是子类实例自身
- 若父类原型上没有该属性,super.xxx 返回 undefined,不会继续向上查原型链
在子类静态方法中:super 指向父类本身(Parent 构造函数)
这时 super 相当于父类的类名,可用于调用父类的静态方法或访问静态属性。
- super.staticMethod() 等价于 Parent.staticMethod()
- super 不能在静态方法中访问实例方法或原型方法
- 静态方法里的 this 指向子类构造函数,而 super 指向父类构造函数
其他硬性限制
这些不是 bug,而是引擎为保障继承语义做的强制约束:
- super 只能在 class 内部使用,不能出现在普通函数、箭头函数或模块顶层
- 不能单独写 console.log(super),必须带调用或属性访问
- 对象字面量中支持 method(){ return super.x },但不支持 arrow: () => super.x 或 x: super.x











