object.getprototypeof(proxy) 默认返回 target 的原型而非 proxy 自身原型;若未定义 getprototypeof 捕获器,则等价于 object.getprototypeof(target);若定义了该捕获器,则以其返回值为准(须为对象或 null);proxy 自身的 [[prototype]] 为 object.prototype,但不影响此行为。

Object.getPrototypeOf 在处理 Proxy 对象时,返回的是其内部目标对象(target)的原型,而不是 Proxy 本身的原型。
Proxy 对象没有自己的原型链入口
Proxy 是一个“透明包装器”,它本身不参与原型链查找。当你对 Proxy 调用 Object.getPrototypeOf() 时,JavaScript 引擎会自动解包,获取其 target 的原型:
- 如果 Proxy 没有自定义
getPrototypeOf捕获器,就直接返回Object.getPrototypeOf(target) - 如果设置了
getPrototypeOf捕获器,则执行该捕获器,并以它的返回值为准(可任意控制) - Proxy 实例的 [[Prototype]] 内部槽始终是
Object.prototype(除非显式设置),但Object.getPrototypeOf(proxy)不读取这个槽
默认行为:返回 target 的原型
例如:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
const proxy = new Proxy(target, {});
console.log(Object.getPrototypeOf(proxy) === Object.getPrototypeOf(target)); // true
console.log(Object.getPrototypeOf(proxy) === Object.prototype); // true
可通过捕获器覆盖返回值
你可以用 getPrototypeOf 捕获器完全控制返回结果,甚至返回 null 或非对象值(但需符合规范约束):
- 捕获器必须返回对象或
null,否则抛出TypeError - 返回值会被当作代理对象的“逻辑原型”,影响
instanceof、属性继承等行为 - 注意:即使捕获器返回了新原型,
proxy instanceof SomeConstructor仍依赖该原型是否在原型链上
与 Object.setPrototypeOf 的配合限制
Object.setPrototypeOf(proxy, newProto) 默认会失败(抛出 TypeError),因为 Proxy 的 setPrototypeOf 捕获器默认返回 false(不可配置)。要支持修改,需显式实现该捕获器并返回 true:
- 仅当
setPrototypeOf捕获器返回true且新原型合法时,修改才生效 - 此时再调用
Object.getPrototypeOf(proxy)就会返回你设置的新原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










