super.property行为高度依赖上下文:实例方法中仅代理父类原型上的方法和getter;静态上下文中只读父类静态属性;箭头函数等非class词法环境禁用super。

在 Class 继承中,super.property 不是通用的“访问父类属性”的快捷方式,它的行为高度依赖上下文——是出现在实例方法、静态方法、还是 static 块中;访问的是普通属性、访问器(getter/setter),还是静态成员。搞错场景,轻则读到 undefined,重则静默污染或抛错。
实例方法中:super.property 仅代理父类原型上的方法和 getter
在子类的实例方法里,super.property 实际指向父类原型对象上同名的属性描述符(即 Object.getPrototypeOf(super) 上的定义)。它不触发赋值逻辑,也不读取父类实例字段:
- 若
property是普通数据属性(如parent.name = "Tom"),super.name读不到——因为该属性存在实例上,不在原型链上 - 若
property是@property定义的 getter,super.property可安全调用,且this仍绑定当前子类实例 - 若写
super.prop = value,JS 会尝试在super代理对象上设置属性,结果通常是undefined或报错,绝不会触发父类 setter
setter 中不能用 super.prop = value,应显式调用 fset
父类若定义了 @prop.setter,子类 setter 中想复用其校验逻辑,不能靠赋值语句,而要手动触发描述符协议:
- ✅ 正确:
super.constructor.prototype.prop.fset.call(this, value)或Object.getOwnPropertyDescriptor(Parent.prototype, 'prop').set.call(this, value) - ✅ 更简洁:
super.prop = value在多数引擎中无效;改用this._prop = value(如果父类 setter 内部只是存私有字段) - ❌ 错误:
super.prop = value—— 这既不调用父类 setter,也不保证字段更新,极易埋下逻辑漏洞
静态上下文中:super.prop 只读父类静态属性
在 static 块或静态方法中,super.prop 可直接读取父类的静态属性(包括 static get),但不可赋值:
-
static { console.log(super.VERSION); }✅ 有效(假设父类有static VERSION = '1.0') -
static init() { super.BASE_URL = 'https://api.example.com'; }❌ 报错或静默失败——super在静态上下文中是只读代理 - 修改静态属性必须通过父类名:
Parent.BASE_URL = '...'
不能在箭头函数、普通函数字面量或数组方法中使用 super
super 的绑定依赖词法环境,只在 class 方法体、static 块、以及特定格式的 object method 中合法:
- ✅ 允许:
method() { super.foo(); }、static m() { super.bar(); }、static { super.baz; } - ❌ 禁止:
func: () => { super.x; }、func: function() { super.x; }、[() => super.x][0]()—— 全部语法错误 - 原因:这些写法脱离了 class 的词法作用域,
super无法解析目标父类











