Proxy 可拦截对象读写操作,通过 set 拦截器捕获变更并触发上报,需处理赋值拦截、深比较判断变化、递归代理嵌套结构、节流去重及框架适配等细节。

Proxy 可以拦截对象的读写操作,通过 set 拦截器捕获数据变更,并在其中触发上报逻辑。关键在于:拦截赋值、判断是否真正变化、避免重复上报、支持异步节流。
用 Proxy 包裹目标对象并监听 set
创建 Proxy 实例时,在 handler.set 中获取新旧值,决定是否需要上报:
- 接收
target(原始对象)、key(属性名)、value(新值)、receiver - 先用
Reflect.get(target, key)获取当前值,与value比较(注意引用类型需深比较或用 JSON.stringify 粗略判断) - 若值不同,调用上报函数(如
reportChange(key, oldValue, value)) - 最后必须返回
Reflect.set(...)或true,否则赋值失败
处理嵌套对象和数组更新
Proxy 默认不递归代理子属性,需手动递归包装:
- 在
set中,对新值是对象或数组的情况,用同一套代理逻辑再次 wrap(如createReportProxy(value)) - 对数组方法(如
push、splice)的拦截需在handler中补充get拦截,对数组原型方法返回代理版本 - 更稳妥的方式:使用
Proxy.revocable或封装一个可递归代理的工厂函数
控制上报频率与去重
频繁修改可能引发大量请求,应加入节流或合并机制:
- 用
setTimeout延迟上报,多次变更只触发最后一次(防抖) - 收集变更字段到队列(如
pendingChanges.push({ key, oldValue, newValue })),定时批量上报 - 记录上次上报时间戳或版本号,跳过短时间内重复变更
- 上报成功后清空缓存;失败时可重试或丢弃(视业务重要性而定)
配合 Vue/React 等框架注意事项
Proxy 代理对象不能直接替换响应式系统内部状态,需适配:
- 在 Vue 3 中,
reactive底层就是 Proxy,可复用其机制,或用watch监听 proxy 对象 - 在 React 中,Proxy 对象需配合
useState或useReducer触发重渲染,上报逻辑放在useEffect或自定义 Hook 中 - 避免将 Proxy 对象直接传给不支持的库(如某些表单组件),必要时用
toRaw或解构为普通对象
不复杂但容易忽略细节:深比较开销、循环引用、不可配置属性、Symbol 键、以及 Proxy 无法拦截的场景(如 Object.keys、for...in)。实际项目中建议结合业务粒度选择上报时机——比如仅上报表单提交前的终态,而非每次输入都发请求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











