super是JavaScript类继承中调用父类构造函数和方法的关键字:子类构造函数必须先调用super()初始化父类,普通方法中可用super.methodName()调用父类同名方法,且super绑定父类而非运行时this。

在 JavaScript 类继承中,super 是访问父类构造函数和原型方法的关键字。它不是简单地“指向父类”,而是在子类的构造函数或方法中,提供对父类对应成员(尤其是同名方法)的安全调用能力。
在子类构造函数中必须用 super() 初始化父类
子类若定义了 constructor,就必须显式调用 super(),且必须在使用 this 之前调用。这是因为子类实例的内部属性(如 this 所依赖的 [[Environment]] 和 [[Prototype]])需由父类构造函数设置。
- 不调用
super()会报错:ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor -
super()本质是调用父类的 constructor,并将当前新建的对象(this)作为上下文传入 - 若父类构造函数需要参数,
super(...args)必须传入相应参数
在普通方法中用 super.方法名 调用父类同名方法
当子类重写了父类方法(如 render()、toString()),又想复用父类逻辑时,可用 super.methodName() 显式调用父类版本。此时 this 仍指向当前子类实例,保证父类方法内访问的仍是子类实例的属性。
-
super.render()等价于Object.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this),但更安全、语义清晰 - 不能在静态方法里用
super调用实例方法,也不能在实例方法里用super调用静态方法(类型不匹配) - 若父类方法是箭头函数,则无法通过
super调用(箭头函数没有自己的this,也不参与原型链查找)
super 在 getter/setter 和静态方法中的用法
super 同样适用于访问父类的访问器属性和静态方法,规则一致:路径明确、上下文正确、不可跨类型调用。
立即学习“Java免费学习笔记(深入)”;
- 在子类 getter 中写
return super.value;,会触发父类原型上的get value() - 静态方法中可写
super.staticMethod(),前提是该方法定义在父类的constructor上(即static staticMethod(){}) -
super不支持动态计算属性名调用(如super[methodName]()会语法错误),只能用于字面量方法名
注意 super 的词法绑定与运行时行为
super 不是变量,而是关键词;它在定义时就绑定到当前类的直接父类,不会因赋值或 call/apply 改变目标。这与 this 的动态绑定不同。
- 即使把带
super的方法赋给变量再调用,super依然指向原父类,而非调用时的 this 所属类 - 不能解构含
super的方法(如const { method } = instance;),否则会丢失super绑定,运行时报错 - Babel 或 TypeScript 编译时会将
super转为类似_get(_getPrototypeOf(Child.prototype), "method", this).call(this)的安全调用


















