super在静态方法中指向父类构造函数,仅支持方法调用(如super.method()),不支持属性访问或赋值;其绑定由类定义时的[[prototype]]链静态确定,与调用上下文无关。

super 在静态方法中不指向实例,也不指向当前类的原型,它指向当前类的父类(即构造函数的 [[Prototype]])——但仅在静态方法内部通过 super 调用时生效,且只支持方法调用,不能访问属性或用于赋值。
super 在静态方法中的实际绑定对象
当在子类的静态方法中使用 super.methodName(),JavaScript 引擎会沿当前类的 [[Prototype]] 链向上查找,找到父类(即 ParentClass),并以该父类为 this 值调用对应静态方法。注意:这里的 this 是父类本身(一个函数对象),不是实例,也不是子类实例。
例如:
class A {
static foo() { console.log('A.foo'); }
}
class B extends A {
static bar() { super.foo(); } // 等价于 A.foo()
}
B.bar(); // 输出 'A.foo'
不能用 super 访问静态属性或进行赋值
super 在静态上下文中仅支持方法调用语法(super.xxx()),不支持属性读取(super.prop)、赋值(super.prop = val)或 in、delete 等操作。这些都会报 SyntaxError 或 ReferenceError。
-
super.staticProp→ 报错:无法读取静态属性 -
super.staticMethod = function(){}→ 报错:非法左值 - 想访问父类静态属性?必须显式写
Object.getPrototypeOf(B).staticProp或A.staticProp
super 指向与类定义时刻绑定,不受调用方式影响
即使通过其他引用调用静态方法,super 的解析仍基于**方法定义时所在的类**,而非调用时的上下文。也就是说,它由词法作用域决定,不是动态绑定。
例如:
class C extends B {
static test() { super.bar(); } // super 指向 B,不是 C 的父类 A
}
C.test(); // 先调 B.bar(),B.bar 内部 super.foo() 仍指向 A
这里 C.test 中的 super.bar() 查找的是 B.bar(因为 Object.getPrototypeOf(C) === B),而 B.bar 内部的 super.foo() 查找的是 A.foo(因为 Object.getPrototypeOf(B) === A)。
与普通方法中 super 的关键区别
静态方法里的 super 和实例方法里的 super 共享同一套语义机制(都基于 [[Prototype]] 查找),但目标对象不同:
- 实例方法中:
super.method()的this是当前实例,查找从Object.getPrototypeOf(this.constructor)开始 - 静态方法中:
super.method()的this是父类构造函数本身,查找从Object.getPrototypeOf(CurrentClass)开始 - 二者都不受
call/apply影响,super绑定在定义阶段固化











