getprototypeof 拦截器可捕获 object.getprototypeof()、__proto__ 访问及 instanceof 底层原型查找;需配合 get trap 实现多源委托,并注意影响 instanceof 判断与相关操作一致性。

可以用 getPrototypeOf 拦截器捕获所有读取对象原型的行为,包括 Object.getPrototypeOf()、obj.__proto__ 和 instanceof 判断的底层查找过程。
getPrototypeOf 是核心拦截点
只要在 handler 中定义 getPrototypeOf(target),就能控制返回哪个对象作为“逻辑上的原型”:
- 返回任意对象(比如空对象、合成对象、另一个代理),不一定要是
target的真实原型 - 返回
null可让对象表现得像没有原型(需注意instanceof会因此失败) - 避免直接返回
Object.getPrototypeOf(target),否则无法实现自定义逻辑
配合 get 实现多源委托式原型行为
仅改 getPrototypeOf 不足以让属性访问也走新原型链。你需要联动 get trap 来模拟查找:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 在
get中,当属性不在target上时,手动去你指定的“逻辑原型”上查找 - 用
Reflect.get(prototype, prop, receiver)保持正确的this绑定 - 这样即使
getPrototypeOf返回了一个代理对象,它的get也能继续向下委托
影响 instanceof 和类型判断
instanceof 的执行依赖 getPrototypeOf 返回值 + 原型链遍历:
- 如果你返回一个伪造的原型,而它又没有正确链接到构造函数的
prototype,obj instanceof Ctor就会为false - 若想让它通过,可让
getPrototypeOf返回一个对象,其自身__proto__指向Ctor.prototype - 但注意:不能绕过引擎对原型链的物理验证,只能控制起点和路径
别忘了配套处理其他相关操作
单独改 getPrototypeOf 容易造成行为不一致:
- 如果还用了
setPrototypeOf,建议一并拦截并做校验(比如禁止修改) -
isExtensible、preventExtensions等虽不直接相关,但在安全敏感场景常需同步约束 -
has和ownKeys虽不涉及原型读取,但会影响属性可见性,与原型语义强相关










