javascript中Proxy能够监听到嵌套对象的引用变化吗?

默认情况下,Proxy只代理直接包裹的对象,其内部的嵌套对象仍是原始对象,‌不会被自动代理‌,Proxy所以只能监听到「目标对象自身属性的引用变化」,无法直接监听到嵌套对象内部的属性 / 引用变化。

解决方案‌:手动对嵌套对象递归创建 Proxy,就能监听其内部的引用和属性变化。

通过在 get 拦截器中,判断属性值是否为对象(且非 null),若是,则‌递归创建 Proxy‌ 包装该嵌套对象。

一旦实现递归代理,即可监听到“对象中的对象”的属性访问(get)和修改(set)。

 1 function deepProxy(target) {
 2   return new Proxy(target, {
 3     get(target, key) {
 4       const val = Reflect.get(target, key);
 5       // 若读取的是对象(非 null),则递归创建 Proxy
 6       return val && typeof val === "object" ? deepProxy(val) : val;
 7     },
 8     set(target, key, value) {
 9       console.log(`修改了 ${key}(值:${JSON.stringify(value)})`);
10       return Reflect.set(target, key, value);
11     }
12   });
13 }
14 
15 const obj = { a: { b: 1 } };
16 const deepProxyObj = deepProxy(obj);
17 
18 // 1. 修改嵌套对象内部属性
19 deepProxyObj.a.b = 3; 
20 // 先触发 get 读取 a → 递归代理 a → 触发 set 修改 b → 输出:修改了 b值:3
21 // 2. 替换嵌套对象引用
22 deepProxyObj.a = { b: 4 }; 
23 // 输出:修改了 a值:{"b":4}

 

posted @ 2026-03-04 13:46  口木秋子  阅读(3)  评论(0)    收藏  举报