super在JavaScript中身份随上下文切换:构造函数中是父类构造器且必须首行调用;实例方法中指向父类原型,仅单步查找;静态方法中指向父类构造函数。

super 不是万能代理,它在 JavaScript 类中会根据所处上下文切换身份:构造函数里它是父类构造器,普通方法里它是父类原型,静态方法里它是父类构造函数本身。
在子类构造函数中:必须首行调用的初始化开关
super() 是启动继承链的强制入口。子类定义了 constructor 就必须第一行写 super() 或 super(args),否则访问 this 会立即报 ReferenceError: Must call super constructor before accessing 'this'。
- 它实际等价于
Parent.prototype.constructor.call(this, args),执行父类逻辑,但 this 始终绑定最终子类实例 - 不能放在 if、try、await、setTimeout 等异步或条件块内——引擎在解析阶段就拒绝这种写法
- 若需异步准备数据,应改用工厂函数:先 await 获取数据,再同步 new Child(data)
在普通实例方法中:只查父类 prototype 的“单步跳转”
这里的 super 是一个只读引用,指向直接父类的 prototype(比如 B.prototype),不会继续向上查找,也不看父类实例属性。
-
super.method()等价于Object.getPrototypeOf(this).method.call(this),方法内 this 仍是当前子类实例 -
super.prop只能读取父类 prototype 上定义的属性或 getter;父类构造器里写的this.x = 1,子类中super.x拿不到,返回 undefined -
super.prop = val实际等同于this.prop = val,赋值目标永远是当前子类实例,不修改父类原型
在静态方法中:指向父类构造函数的“类级代理”
静态上下文中的 super 绑定的是父类本身(如 Parent),不是原型,也不是实例,因此没有“必须首行”“不能异步”等限制。
立即学习“Java免费学习笔记(深入)”;
-
super.staticMethod()直接调用父类静态方法,等价于Parent.staticMethod() - 多层继承时(A ← B ← C),
C.info()中的super就是B,不是A;若 B 的静态方法里也写了super.info(),才会走到 A - 不能写
super()(带括号)——那只是构造函数语法,在静态方法里非法
被忽略但关键的硬性边界
这些不是风格建议,而是语法铁律:
- 箭头函数里禁止使用 super:它没有自己的执行上下文,要么继承外层的 super 绑定,要么直接报错
- super 只能在 class 内部使用;对象字面量中支持,但普通函数、模块顶层、事件回调里写 super 都会语法报错
- 不能单独写
console.log(super);必须配合调用(super())或属性访问(super.xxx) - 多层继承中,super 不自动递归;某一层漏写 super() 或 super.xxx(),整条链就在那里中断,不会“智能补上”


















