proxy 通过 get/set 拦截属性读写,统一接管所有属性访问,适用于响应式、校验等场景;需配合 reflect 方法转发、weakmap 管理依赖,并注意 receiver 参数以确保正确绑定。

直接用 Proxy 拦截属性读写,是最自然、最完整的自定义存取逻辑方式。它不依赖逐个定义 getter/setter,而是统一接管对象所有属性访问行为,适合响应式、校验、日志、默认值等场景。
核心:用 get 和 set 拦截读写
Proxy 的 get 和 set 是最常用两个陷阱(trap),分别在读取和赋值时触发:
- get(target, prop, receiver):返回属性值前可加逻辑,比如检查是否存在、补默认值、记录访问、收集依赖
- set(target, prop, value, receiver):赋值前可做校验、格式转换、触发通知,返回 true 表示设置成功
- 务必配合 Reflect.get / Reflect.set 转发操作,保证原语义不丢失
常见实用模式
不同需求对应不同拦截策略,无需重写整个对象:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 属性不存在时返回默认值:在 get 中判断 prop 是否 in target,不是就返回预设值(如 null 或 '')
- 写入校验:在 set 中对特定字段(如 age、email)做类型或格式检查,非法则 throw 错误
- 访问日志:get/set 里打印时间、属性名、值,便于调试或审计
- 响应式联动:get 时把当前副作用函数存入依赖池;set 时遍历并执行所有关联函数
注意 WeakMap 管理依赖关系
多个代理对象共用 handler 时,需避免依赖混淆:
- 用 WeakMap 以代理对象为 key,存储其专属的依赖集合(如 Map
>) - WeakMap 不阻止垃圾回收,防止内存泄漏
- 不要把依赖存在 handler 对象上——那会全局共享,导致交叉影响
别漏掉 receiver 参数
尤其在涉及原型链或 this 绑定时,receiver 很关键:
- 它代表原始访问者(可能是 proxy 本身,也可能是继承链上的对象)
- Reflect.get(target, prop, receiver) 中传 receiver,才能正确支持 super 和 this 绑定
- 忽略 receiver 可能导致 getter 内部 this 指向错误,尤其在类实例代理中










