super 是类继承中调用父类构造函数和方法的关键机制,必须在派生类 constructor 首行调用 super() 以初始化 this,且仅在类方法中有效;类表达式与类声明中 super 行为完全一致。

super 在类表达式中不是“可选语法糖”,而是实现继承链调用的关键机制,它必须出现在子类构造函数的 this 使用之前,且行为严格依赖于类的继承结构。
super() 必须在子类 constructor 中显式调用
在派生类(即 extends 其他类的类)的 constructor 中,若定义了 constructor,则 必须第一行调用 super(),否则会报错 ReferenceError: Must call super constructor in derived class before accessing 'this'。
- super() 会执行父类构造函数,并初始化
this绑定,这是访问this的前提 - 即使父类没有显式 constructor,也需调用 super()(此时等效于执行空的父构造函数)
- 不能在 super() 前访问
this、返回值、或任何实例属性/方法调用
super 可用于调用父类方法和访问父类属性
在 constructor 之外的实例方法或静态方法中,super 指向父类的原型对象(对实例方法)或父类本身(对静态方法),可用于安全地复用父逻辑。
- 实例方法中:
super.methodName()调用父类原型上的同名方法;super.prop访问父类原型上定义的 getter(注意:不能直接读取父类实例属性,除非通过 getter) - 静态方法中:
super.staticMethod()调用父类的静态方法,此时 super 指向父类构造函数 - 不能在箭头函数或普通函数中单独使用 super —— 它只在类方法(含 static)的词法作用域内有效
类表达式中 super 的行为与类声明完全一致
类表达式(如 const Child = class extends Parent { ... })中 super 的语义和限制与类声明无区别,JavaScript 引擎按相同规则解析其继承上下文。
- 类表达式同样生成具有 [[Constructor]] 内部方法的函数对象,super 绑定由 extends 关系静态确定
- 匿名或命名的类表达式不影响 super 解析 —— 关键是是否为派生类(即有 extends)
- 常见误区:以为类表达式“更动态”就可绕过 super 限制,实际运行时仍强制校验调用时机和上下文
错误用法与典型报错场景
以下写法在类表达式中会立即抛出运行时错误:
- 子类 constructor 中未调用 super() →
ReferenceError - super() 出现在 this 使用之后 → 同样触发
ReferenceError - 在非派生类(无 extends)中使用 super →
SyntaxError(解析阶段报错) - 在对象字面量方法或普通函数中写 super.xxx →
SyntaxError(语法非法)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











