Reflect.get无法真正优化super属性访问,因super必须编译时绑定原型链;但可通过Reflect.get显式指定原型和receiver来模拟super行为,在多层继承中精准定位上层属性并正确绑定this。

直接用 Reflect.get 无法真正“优化”对 super 属性的动态访问,因为 super 本身不支持动态求值——它必须在编译时绑定到确定的原型链位置。但你可以绕过 super 的语法限制,用 Reflect.get 模拟其行为,在复杂继承中更可控、更可预测地读取上层属性。
为什么 super 不能动态使用
super.prop 是静态语法,JS 引擎在函数定义时就锁定了当前方法的 [[HomeObject]] 和对应原型链上的查找起点。你不能写 super[methodName] 或 super[unknownKey],运行时会报 SyntaxError 或 ReferenceError。
用 Reflect.get 模拟 super 查找逻辑
核心思路:明确指定要查的原型对象(即你想“当作 super”的那个原型),再用 Reflect.get 在该对象上读取属性。这需要你知道目标属性定义在哪一级原型上,或按需遍历原型链。
- 获取目标原型:可用
Object.getPrototypeOf(this)得到直接父类原型,或用循环向上找特定构造器的 prototype - 传入 receiver:确保 getter 正确绑定
this,把当前实例作为receiver参数传给Reflect.get - 处理 getter:
Reflect.get自动触发 getter,行为与super.xxx一致
在多层继承中安全定位“逻辑 super”
当类 A → B → C → D 多重继承,而你想从 D 中访问 B 定义的属性(跳过 C 的覆盖),就不能依赖 super(它只指 C.prototype)。此时应手动定位:
- 用
Object.getPrototypeOf(Object.getPrototypeOf(this))获取 B.prototype(假设 C 没改原型链) - 更健壮的做法:遍历
Object.getPrototypeOf(this)链,匹配构造器名或 Symbol 标记 - 封装工具函数,如
getSuperProp(obj, key, targetCtor),内部用Reflect.get+ 原型匹配
注意 this 绑定和 descriptor 行为
Reflect.get(target, key, receiver) 中的 receiver 决定了 getter 内部的 this。若省略,getter 的 this 会是 target(通常是 prototype),导致错误;必须传 this 实例,才能复现 super 的 this 行为。
例如:✅ 正确 — Reflect.get(Object.getPrototypeOf(this), 'foo', this);❌ 错误 — Reflect.get(Object.getPrototypeOf(this), 'foo')(this 指向 prototype)。

















