super是受严格规则约束的原型访问机制:仅在对象方法简写中合法,指向直接原型且不沿链查找;调用时this仍绑定当前对象;读取从原型获取,赋值则作用于当前实例。

super 在对象方法中不是语法糖,而是受严格规则约束的原型访问机制:它只在对象方法简写语法中合法,且始终指向当前对象的直接原型,查找时不会越过该原型继续向上。
super 只能在方法简写中使用
JavaScript 要求 super 出现在明确被识别为“方法”的上下文中。只有对象字面量中的方法简写(即 name() { ... } 形式)才被引擎视为合法位置;其他写法如属性赋值、箭头函数或普通函数表达式中使用 super 都会报 SyntaxError。
- ✅ 合法:
const obj = { method() { return super.prop; } }; - ❌ 非法:
const obj = { method: function() { return super.prop; } }; - ❌ 非法:
const obj = { method: () => super.prop };
super 指向的是直接原型,不是任意上级
当执行 super.xxx 时,JavaScript 从 Object.getPrototypeOf(this) 开始查找,仅限该原型对象自身属性,不沿整个原型链递归搜索。若该原型上不存在对应属性,结果为 undefined,不会继续查它的原型。
- 例如:
const parent = { a: 1 }; const child = { b() { return super.a; } }; Object.setPrototypeOf(child, parent); child.b(); // 返回 1 - 若
parent自身没有a,而是在parent.__proto__上,super.a仍返回 undefined
方法调用时 this 仍绑定当前对象
通过 super 调用父类方法,方法内部的 this 不会变成父类实例,而是保持为当前子对象。这意味着父类方法中读取的 this.xxx 是子对象上的属性值,不是父类原型上的同名属性。
立即学习“Java免费学习笔记(深入)”;
- 例如:
const parent = { getName() { return this.name; } }; const child = { name: 'child', say() { return super.getName(); } }; Object.setPrototypeOf(child, parent); child.say(); // 返回 'child' - 这等价于
Object.getPrototypeOf(child).getName.call(this),而非.call(parent)
super.xxx = val 实际写入当前实例
对 super 属性赋值(如 super.x = 1)并不会修改父类原型,而是等价于 this.x = 1。JavaScript 规范明确规定:super 的赋值操作目标永远是当前 this 所指对象。
- 即使父类原型上有同名 setter,
super.setProp = val也会触发该 setter,但 this 仍是当前实例 - 读取
super.x是从原型找值,写入super.x = v是给当前实例设值 —— 这种读写不对称需特别注意


















