super在JavaScript继承中“丢失”本质是语法、时机或原型结构问题,常见于子类constructor未首行调用super()、父类方法定义在实例上而非原型、继承链断裂、箭头函数误用super等场景。

JavaScript 中 super 在继承中“丢失”,通常不是关键字真的消失了,而是它无法被正确访问或调用——本质是语法、时机或原型结构出了问题。这类错误往往导致 ReferenceError 或 TypeError,且多数在实例化或方法调用时立即暴露。
子类 constructor 中没调或错序调用 super()
这是最常见也最致命的错误。只要显式写了 constructor(),就必须在第一行可执行语句调用 super()(注释和变量声明不算)。
- 写成
constructor() { this.name = 'x'; super(); }→ 报ReferenceError: Must call super constructor before accessing 'this' - 写成
constructor() { return; super(); }→super()永远不会执行,同样报错 - 空构造函数
constructor() {}→ 无 super,直接崩溃
修复方式:删掉 constructor 就自动安全;若必须自定义,严格保证 super(...) 是第一条可执行语句,参数按父类要求传递。
父类方法定义在构造函数内,不在原型上
如果父类把方法赋值给 this.xxx = function(){},那该方法属于实例属性,不会出现在 Parent.prototype 上。子类用 super.xxx() 会找不到,抛 TypeError: (intermediate value).xxx is not a function。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
this.updateUI = () => { ... };或this.updateUI = function() { ... };在父类 constructor 中 - 正确写法:把方法定义为类成员(即写在 class body 里),或用私有字段 + 公共方法组合
例如:用 updateUI() { ... } 替代 this.updateUI = function() { ... };,确保它存在于 Parent.prototype 上。
原型链断裂或 extends 失效
当 super.xxx() 看似存在却调用失败,可能是继承关系根本没建立成功。
- 检查父类是否为合法构造函数(比如不是
undefined或普通对象) - 运行
Sub.__proto__ === Parent和Object.getPrototypeOf(Sub.prototype) === Parent.prototype,确认继承链完整 - 若
new Sub()后Sub.prototype.__proto__指向Object.prototype,说明extends Parent没生效,大概率是父类未定义或拼写错误
在箭头函数或普通函数中误用 super
super 只在类的构造函数和普通方法(非箭头)中有效。它依赖词法绑定的执行上下文,而箭头函数不绑定自己的 this 和 super。
- 错误:
someMethod = () => { super.speak(); }→ 报SyntaxError或ReferenceError - 正确:改用普通方法定义
someMethod() { super.speak(); }
注意:静态方法中 super 指向父类构造函数本身,不能用于访问实例方法;实例方法中 super 始终查父类原型,不跨级也不查实例属性。


















