super 的解析是上下文依赖的绑定机制:构造函数中必须首行调用 super() 初始化父类并绑定 this;实例方法中 super.method() 从父类原型查找方法,this 指向子类实例;静态方法中 super.staticMethod() 指向父类构造器,仅支持调用语法。

super 的解析不是“静态 vs 动态”的二选一,而是在不同上下文中采用不同绑定机制:它在类定义时就由引擎锁定目标(静态连接),但具体行为表现取决于使用位置——构造函数、实例方法或静态方法。这种设计让 super 既可靠又语义清晰,但容易因混淆上下文而出错。
super 在构造函数中:必须首行调用的同步初始化
子类 constructor 中的 super() 是唯一能作为函数调用的 super 形式,它代表父类构造函数,且必须在第一行执行。这不是运行时判断,而是语法强制——JS 引擎在解析 class 时就检查该约束,延迟、条件包裹或异步调用都会直接报 SyntaxError 或 ReferenceError。
- 作用是初始化父类状态,并为子类实例绑定
this;不调用则this不可用 - 等价于
Parent.prototype.constructor.call(this, ...args),但this最终指向子类实例 - 参数必须匹配父类构造函数签名,否则父类内部逻辑(如
this.name = name)可能失效
super 在实例方法中:基于原型链的只读访问
普通方法里的 super.methodName() 不是变量,而是一个语法结构,用于从父类 prototype 上查找并调用方法。它的绑定发生在定义时,查找路径固定:从 Object.getPrototypeOf(当前类) 开始,只查一层(即直接父类原型),不继续向上遍历。
- 调用时,方法内部的
this仍是当前子类实例,不是父类实例 - 不能访问父类构造函数中挂载的实例属性(如
this.x = 1),只认Parent.prototype.x -
super.prop = val实际赋值给this.prop,不会修改父类原型
super 在静态方法中:指向父类构造器的词法引用
静态方法中的 super.staticMethod() 指向的是父类本身(即构造函数对象),而非其原型。这个绑定由类定义时的 [[Prototype]] 链决定,与调用方式无关——它是词法性的,不是基于调用栈或 this 的动态查找。
立即学习“Java免费学习笔记(深入)”;
- 等价于直接写
Parent.staticMethod(),不涉及实例、不依赖 this - 仅支持方法调用语法(
super.xxx()),super.prop或super.prop = val均报错 - 多层继承中,
GrandChild静态方法里的super永远指Child,不会跳过中间类
super 不可用的典型场景
这些不是运行时错误,而是解析阶段就被拒绝的语法违规:
- 箭头函数里写
super.xxx()→ 报错,因为箭头函数没有自己的方法上下文 - 在普通函数、模块顶层或对象字面量方法中使用
super→ 无效,super只存在于 class 内部方法或构造函数中 - 单独输出
console.log(super)→ 语法错误,super不能脱离属性访问或调用存在 - 静态方法中写
super()(带括号)→ 错误,super()仅限构造函数语法


















