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

Proxy 捕获器(trap)不是“陷阱”,而是拦截目标对象操作的钩子函数。设置捕获器的关键在于:正确声明 Proxy 第二个参数(handler 对象),并在其中定义对应的操作方法,如 get、set、has 等。
必须返回合理值,否则可能报错
部分捕获器有明确的返回要求。例如:
-
set必须返回布尔值,表示赋值是否成功;返回false且非严格模式下静默失败,严格模式下抛TypeError -
has、ownKeys、getOwnPropertyDescriptor等也需返回指定类型,否则会触发 TypeError - 若未定义某个捕获器,对应操作会直接转发到目标对象,不拦截
避免无限递归,慎用 this 或原始操作
在捕获器内部读写目标对象时,若直接使用 this 或未通过 Reflect 调用,容易引发堆栈溢出:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 错误写法:
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 实例,影响属性访问链:
- 调用
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)可能出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










