Proxy 的 get 拦截器中 this 默认为 undefined 或全局对象,与目标对象无关;必须用 Reflect.get(target, prop, receiver) 传递 receiver 参数,才能使 getter 中的 this 正确指向实际调用者。

在 Proxy 的 get 拦截器中,this 的绑定不会自动继承目标对象的上下文;直接用 Reflect.get(target, prop, receiver) 才能正确保留 this(即 receiver)的语义,避免丢失原始调用时的接收者。
为什么 get 拦截器里 this 会出问题?
Proxy 的 get 拦截器本身是一个普通函数,它的 this 值默认是 undefined(严格模式)或全局对象(非严格),和被代理对象无关。而属性访问(如 obj.x)中的 this 实际应指向本次访问的“接收者”——也就是触发 get 的那个对象(可能是 proxy 本身,也可能是继承链上的派生对象)。这个接收者由第三个参数 receiver 显式传入拦截器,必须手动传递给 Reflect.get,否则会丢失。
正确写法:始终用 Reflect.get 并传入 receiver
不要写 target[prop] 或 target[prop].call(target),它们会破坏原型链、getter 绑定、以及 this 上下文。应该:
- 用
Reflect.get(target, prop, receiver)转发读取操作 -
receiver是拦截器第三个参数,代表本次访问的原始接收者 - 这样 getter 中的
this就会正确指向receiver,而非target
一个典型例子:带 getter 的对象被 Proxy 包裹
比如有个对象定义了 fullName getter,依赖 this.firstName 和 this.lastName:
立即学习“Java免费学习笔记(深入)”;
const target = { firstName: 'Alice', lastName: 'Smith' };Object.defineProperty(target, 'fullName', {
get() { return `${this.firstName} ${this.lastName}`; }
});
const proxy = new Proxy(target, {
get(target, prop, receiver) {
// ✅ 正确:receiver 传给 Reflect.get
return Reflect.get(target, prop, receiver);
}
});
console.log(proxy.fullName); // 'Alice Smith'
如果误写成 return target[prop],则 getter 内部的 this 会是 target —— 看似一样,但一旦 proxy 被继承或作为其他对象的原型,this 就错乱了;而用 Reflect.get + receiver 能保证 getter 始终以调用时的实际接收者为 this。
进阶注意:receiver 不一定是 proxy 本身
当 proxy 在原型链上,或被其他对象通过 Object.setPrototypeOf 设置为原型时,receiver 可能是那个“真正发起访问”的对象。例如:
const obj = { __proto__: proxy };
obj.x; // receiver 是 obj,不是 proxy
此时若忽略 receiver,getter 或方法内部的 this 就会错误地指向 proxy 或 target,而不是实际调用者 obj —— 这正是 Reflect.get 设计该参数的根本原因。


















