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}

浙公网安备 33010602011771号