Proxy捕获器是拦截目标对象操作的钩子函数,需在handler中正确定义如get、set等方法并返回合规值,慎用this和原始操作以防递归,推荐统一使用Reflect配合receiver参数。

Proxy 捕获器(trap)不是“陷阱”,而是拦截目标对象操作的钩子函数。设置捕获器的关键在于:正确声明 Proxy 第二个参数(handler 对象),并在其中定义对应的操作方法,如 get、set、has 等。
必须返回合理值,否则可能报错
部分捕获器有明确的返回要求。例如:
-
set必须返回布尔值,表示赋值是否成功;返回false且非严格模式下静默失败,严格模式下抛TypeError -
has、ownKeys、getOwnPropertyDescriptor等也需返回指定类型,否则会触发 TypeError - 若未定义某个捕获器,对应操作会直接转发到目标对象,不拦截
避免无限递归,慎用 this 或原始操作
在捕获器内部读写目标对象时,若直接使用 this 或未通过 Reflect 调用,容易引发堆栈溢出:
- 错误写法:
target[prop] = value在set中会再次触发set捕获器 - 推荐写法:统一用
Reflect.get(target, prop, receiver)和Reflect.set(target, prop, value, receiver) -
receiver通常传入当前 proxy 实例,确保 getter/setter 正确绑定
注意 this 指向和 receiver 参数
捕获器函数中 this 指向 handler 对象,不是 proxy 本身;而 receiver 是 proxy 实例,影响属性访问链:
立即学习“Java免费学习笔记(深入)”;
- 调用
obj.method()时,receiver是obj(即 proxy),确保method内部this正确 - 若手动调用
Reflect.get(target, 'x', someOtherObj),则someOtherObj成为 receiver,可能改变 getter 行为 - 多数场景直接传
receiver参数(由 Proxy 自动提供)即可
可组合多个捕获器,但需保持语义一致
一个 handler 可同时定义多个 trap,但逻辑需自洽:
- 比如
set拦截了赋值,get就应能读到对应值,否则产生意外行为 -
has返回true的属性,get不应返回undefined(除非有意设计) - 修改
ownKeys返回值后,需同步调整getOwnPropertyDescriptor,否则Object.getOwnPropertyDescriptors(proxy)可能出错


















