Proxy 本身不是观察者,而是通过 get 拦截实现依赖收集、set 拦截触发更新,配合 activeEffect 和映射表构建“收集—触发”闭环,形成轻量级响应式系统。

JavaScript 中 Proxy 可以通过拦截对象的属性读取(get)和写入(set)操作,配合依赖收集与触发机制,实现轻量级的观察者模式——即当响应式对象的属性被访问或修改时,自动通知并执行关联的更新逻辑。核心不在于“Proxy 本身是观察者”,而在于它作为拦截层,为依赖追踪和响应触发提供基础设施。
用 Proxy 拦截 set 实现属性变更通知
每次对代理对象赋值时,set 拦截器可捕获变更,并主动触发已注册的回调函数(观察者):
- 需维护一个映射表(如
Map),记录每个属性名对应的观察者列表(例如Map<string array>></string>) - 在
set中,先执行原赋值逻辑(target[key] = value),再遍历该 key 对应的所有观察者并调用它们 - 注意返回
true表示赋值成功,否则会抛出TypeError
结合 get 拦截实现依赖自动收集(响应式核心)
仅靠 set 无法知道谁关心哪个属性。真正的响应式需要在读取(get)时“登记”当前正在执行的副作用函数(如渲染函数),即依赖收集:
- 定义一个全局变量(如
activeEffect)暂存当前正在运行的观察者函数 - 在
get拦截中,若activeEffect存在,将其添加到该属性的观察者列表中 - 这样,后续对该属性调用
set时,就能精准通知所有曾读过它的函数
封装成可复用的 reactive 和 effect 工具函数
把上述逻辑封装后,使用体验接近 Vue 3 的响应式系统:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
立即学习“Java免费学习笔记(深入)”;
-
reactive(obj):返回一个 Proxy 代理,拦截所有嵌套层级的get/set(递归处理对象/数组) -
effect(fn):执行fn前设置activeEffect = fn,执行完重置;同时让fn具备“响应式执行”能力 - 当
fn内部读取reactive对象属性时,自动完成依赖收集;属性变化时自动重新执行fn
注意事项与边界情况
实际应用中需处理几个关键细节:
-
避免无限循环:在
set中触发更新时,若更新逻辑又修改了同一属性,需加锁或标记防止递归触发 -
数组索引与 length 变更:Proxy 默认不拦截数组下标赋值(如
arr[0] = x)和push等方法,需用Reflect.set+ 特殊判断,或代理数组方法 -
只读与深层代理:默认 Proxy 不自动代理嵌套对象,需在
get返回值为对象时递归调用reactive -
删除属性:需拦截
deleteProperty并通知对应 key 的观察者
不复杂但容易忽略。Proxy 提供的是能力入口,真正构成观察者模式的是“收集—触发”这一闭环设计。

















