Proxy 通过 receiver 参数间接控制 this 指向,需配合 Reflect.get/set 传递 receiver 以确保 getter/setter 内 this 指向代理对象而非 target;忽略 receiver 会导致 this 绑定错误。

Proxy 本身不直接代理 this,但它能间接影响和监控 this 的行为——关键在于 receiver 参数与 Reflect 方法的配合使用。
receiver 是 this 的实际载体
在 get/set 等 trap 中,第三个(或第四个)参数 receiver 就是调用时的上下文对象,也就是当前操作中 this 所指向的对象。它不一定是 Proxy 实例本身,也可能是继承自 Proxy 的子类实例或通过 call/apply 显式绑定的对象。
- 当执行
proxy.method()时,receiver就是proxy - 当执行
obj.method.call(proxy),且method是定义在原型上的 getter 或函数时,receiver仍是proxy,而非obj - 如果不传
receiver给Reflect.get,可能导致 this 指向丢失,尤其在访问原型链上的 getter 时
用 Reflect.get/set 保持 this 正确传递
直接用 target[prop] 或 target[prop] = value 会忽略 receiver,导致原型方法中 this 指向错误(比如指向 target 而非 proxy)。正确做法是始终用 Reflect.get(target, prop, receiver) 和 Reflect.set(target, prop, value, receiver)。
-
Reflect.get会把receiver作为 getter 内部的 this 值 - 这样即使目标属性是 getter,也能确保其内部 this 指向代理对象,而非原始 target
- 例如:
proxy.name触发 getter 时,getter 内的 this 是proxy,不是target
监控 this 的实际使用场景
你可以在 trap 中记录 this 的来源,判断调用上下文是否符合预期:
- 在
get中打印receiver === proxy,确认是否由代理直接触发 - 在
applytrap(用于代理函数)中,thisArg参数就是函数调用时的 this,可做校验或日志 - 结合
constructtrap,监控 new 调用时的 this 绑定(即新实例)
常见陷阱:别忽略 receiver 的存在
很多初学者在写 set/get 时直接返回 target[prop],看似可行,但一旦目标对象有 getter/setter 或依赖 this 的逻辑,就会出错:
- 错误写法:
return target[prop]→ this 在 getter 内变成target - 正确写法:
return Reflect.get(target, prop, receiver)→ this 在 getter 内保持为receiver - 同理,
set中必须用Reflect.set(target, prop, value, receiver),否则 setter 内 this 错位


















