Proxy 可通过 set 拦截器实现自动保存,需避免无限递归、用 Object.is 判变更、节流控制频率,对嵌套对象可递归代理或浅层处理,并提供 save/cancel/isDirty 等手动控制方法。

可以利用 Proxy 拦截对象的属性赋值操作,在每次 set 时触发保存逻辑,从而实现“自动保存”。关键在于拦截时机、避免无限递归、区分是否真有变更,以及合理控制保存节奏。
拦截 set 操作并触发保存
Proxy 的 set 拦截器是核心。只要目标对象的属性被修改(包括新增或覆盖),就能捕获并执行保存动作:
- 在
set中调用保存函数(如 API 请求、localStorage 写入) - 务必返回
true表示赋值成功,否则严格模式下会报错 - 注意:不要在
set中直接修改代理对象自身,否则可能引发无限循环
避免重复保存和性能问题
频繁修改会导致大量保存请求,需加一层判断和节流:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 仅当新值与旧值不同时才保存(使用
Object.is()比较,支持 NaN 和引用) - 用
setTimeout或requestIdleCallback做防抖,比如延迟 300ms 后保存,连续修改只保存最后一次 - 对批量操作(如解构赋值、
Object.assign)可提供手动save()方法绕过自动机制
处理嵌套对象与响应式更新
默认 Proxy 只代理第一层,深层修改不会触发 set:
- 递归代理:在
get拦截器中,对返回的 object 类型值自动包装为新 Proxy - 但要注意循环引用,可用 WeakMap 缓存已代理对象防止重复代理
- 若只需浅层自动保存(如表单数据),不代理嵌套对象反而更可控、更轻量
提供手动控制与调试能力
自动保存不是万能的,应保留人工干预入口:
- 代理对象上挂载
save()、cancel()、isDirty()等方法 - 内部维护一个 dirty 标志位,
set时置为 true,保存后重置 - 开发时可加日志输出,比如打印变更路径和值,便于排查误触发
不复杂但容易忽略细节,重点是拦截要稳、保存要准、嵌套要慎、控制要留余地。

















