Proxy能够监听到对象中的对象的引用吗?
简短结论原生的new Proxy(target, handler)只能代理「它直接包裹的那一层对象」对target内部的嵌套对象默认是透传的——返回的是裸对象后续操作完全逃逸监听。为什么会听不到嵌套对象const obj { a: { b: 1 } }; const proxy new Proxy(obj, { get(t, k) { console.log(get, k); return Reflect.get(t, k); }, set(t, k, v) { console.log(set, k, v); return Reflect.set(t, k, v); } }); proxy.a.b 99; // 只触发了一次 get(a)返回的是原始裸对象 { b: 1 } // set(b) 永远不会触发执行proxy.a.b 99的过程先走get(proxy, a)→ 拿到obj.a原始{ b: 1 }不是 Proxy然后对这个裸对象执行.b 99→ 跟 Proxy 毫无关系所以不是 Proxy 能力不够而是它根本没有机会介入第二步——因为第一步返回的就不是代理对象。✅ 解法递归代理Proxy Membrane 模式核心思路在get拦截器中凡是读到的值是对象就再给它套一层 Proxy让整条访问链上的每一层都是代理过的function deepProxy(target, handler) { // 缓存避免重复代理 处理循环引用 const cache new WeakMap(); function makeProxy(obj) { if (obj null || typeof obj ! object) return obj; if (cache.has(obj)) return cache.get(obj); const proxy new Proxy(obj, { get(t, key, receiver) { const val Reflect.get(t, key, receiver); // 读到子对象 → 递归代理后返回 return (val ! null typeof val object) ? makeProxy(val) : val; }, set(t, key, value, receiver) { const oldVal t[key]; const result Reflect.set(t, key, value, receiver); handler?.onChange?.({ type: SET, path: key, oldValue: oldVal, newValue: value }); return result; }, deleteProperty(t, key) { const had key in t; const oldVal t[key]; const result Reflect.deleteProperty(t, key); if (had) handler?.onChange?.({ type: DELETE, path: key, oldValue: oldVal }); return result; } }); cache.set(obj, proxy); return proxy; } return makeProxy(target); }使用效果const state deepProxy({ a: { b: 1 }, list: [10, 20] }, { onChange: ({ type, path, oldValue, newValue }) console.log([${type}] ${path}:, oldValue, →, newValue) }); state.a.b 99; // ✅ 能捕获(经过递归代理的 a 的 set 触发) state.list.push(30); // ⚠️ 数组的 push 本质是方法调用set trap 不一定按你想的方式触发 state.a { c: 2 }; // ✅ 外层 set 正常捕获替换整个子对象引用两种引用变化要区分清楚场景能否被外层 Proxy 的set捕获说明proxy.a { c: 2 }替换整个子对象引用✅能​这是 proxy 自身的属性赋值走set(proxy, a, ...)proxy.a.b 99修改子对象内部属性❌不能除非递归代理操作的是子对象外层 proxy 根本碰不到proxy.a proxy.a把子对象重新赋回✅ 能触发 set虽然值没变但赋值行为本身被拦截⚠️ 几个容易踩的坑数组的push、pop等方法它们内部会读写length走的是方法调用路径而非简单set做响应式系统时通常需要额外处理Array的陷阱更复杂Vue 3 用的也不是纯递归 Proxy 这么简单必须用receiver传进Reflect.get如果对象上有 getter 或原型链继承漏掉 receiver 会导致this指向错误// ✅ 正确 const val Reflect.get(t, key, receiver); // ❌ 危险 const val t[key];typeof null object​ → 判断时一定要加 value ! null性能每次get都判断可能创建 Proxy不加缓存的话同个引用被访问 N 次就产生 N 个 Proxy 实例。用WeakMap做缓存是标准做法一句话总结Proxy 本身是单层的——它只看守你交给它的那扇门。​ 想监听对象中的对象就得在get里把每个子对象也变成 Proxy即 Proxy Membrane / 深代理这也就是 Vue 3 的reactive()背后的核心思想。Proxy 不是不能是需要你主动递归地铺网。

相关新闻

Mac版Navicat无限试用三步解决方案:告别14天限制的终极指南

Mac版Navicat无限试用三步解决方案:告别14天限制的终极指南

Mac版Navicat无限试用三步解决方案:告别14天限制的终极指南 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你是否…

2026/6/17 13:57:44阅读更多 →
VisualCppRedist AIO:Windows软件依赖问题的终极解决方案

VisualCppRedist AIO:Windows软件依赖问题的终极解决方案

VisualCppRedist AIO:Windows软件依赖问题的终极解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 当您遇到"MSVCP140.dll缺失"、&q…

2026/6/17 13:57:44阅读更多 →
3步打造您的专属PS3游戏库:IRISMAN让游戏管理变得如此简单

3步打造您的专属PS3游戏库:IRISMAN让游戏管理变得如此简单

3步打造您的专属PS3游戏库:IRISMAN让游戏管理变得如此简单 【免费下载链接】IRISMAN All-in-one backup manager for PlayStation3. Fork of Iris Manager. 项目地址: https://gitcode.com/gh_mirrors/ir/IRISMAN 想象一下这样的场景:您的PS3硬盘…

2026/6/17 13:57:44阅读更多 →
计算机毕业设计之jsp儿童PTC管理系统的设计与实现

计算机毕业设计之jsp儿童PTC管理系统的设计与实现

儿童PTC管理系统是由于儿童依据兴趣爱好自愿组成,按照章程自主开展儿童PTC管理系统。儿童PTC管理系统是实施素质教育的重要途径和有效方式,在加强校园文化建设、提高儿童综合素质、引导儿童适应社会、促进儿童成才就业等方面发挥着重要作用,是…

2026/6/17 20:23:14阅读更多 →
2026深圳豪宅圈里私藏的定制工厂:怎么看一家全屋定制是不是真靠谱?

2026深圳豪宅圈里私藏的定制工厂:怎么看一家全屋定制是不是真靠谱?

在深圳选全屋定制,判断一家品牌是否真正靠谱,最核心的硬指标不是看它在卖场里拿了多大的展位,而是看它是否有过极端挑剔的顶豪项目交付经验。在本地第三方测评的深度追踪中,主打产销一体、高端重度定制的源木匠心之所以在高端圈层…

2026/6/17 20:23:14阅读更多 →
1.5V升压3.3V、5V芯片的静态电流随输入电压升高而降低

1.5V升压3.3V、5V芯片的静态电流随输入电压升高而降低

干电池升压到3V/3.3V/5V,PW5100用起来挺顺手的 单节干电池1.5V或者两节串联3V,想升到3V、3.3V或者5V给后端供电,PW5100这颗芯片可以看看。PFM同步升压,效率能跑到95%,开关频率1.2MHz,静态电流大概10uA&…

2026/6/17 20:23:14阅读更多 →
计算机毕业设计之同城搬家服务平台设计与实现

计算机毕业设计之同城搬家服务平台设计与实现

随着城市化进程的加快,人口流动日益频繁,同城搬家需求不断增长。为满足这一需求,同城搬家服务平台应运而生,它采用了Node.js语言、Express框架和MySQL数据库技术,构建了一个高效、便捷、可靠的在线搬家服务平台。在系统…

2026/6/17 20:23:14阅读更多 →
SEO 在 2026 年:AI 在胡说,而我在改爬虫配置

SEO 在 2026 年:AI 在胡说,而我在改爬虫配置

说真的,2026 年干 SEO 的感觉很奇怪。不是那种“变化太快我跟不上”的奇怪——这种话我从 2018 年就在听了。而是一种更微妙的别扭:你明明感觉自己什么都没做对,但数据竟然慢慢变好了。然后你试图复现这个“成功”,发现上周的配置…

2026/6/17 20:23:14阅读更多 →
3步终极指南:用开源工具永久破解微信QQ消息撤回限制

3步终极指南:用开源工具永久破解微信QQ消息撤回限制

3步终极指南:用开源工具永久破解微信QQ消息撤回限制 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/…

2026/6/17 20:17:59阅读更多 →
飞书机器人接入 OpenClaw 完整落地部署指南(含安装包)

飞书机器人接入 OpenClaw 完整落地部署指南(含安装包)

OpenClaw 2.7.9 对接飞书机器人完整配置教程 本文讲解借助长连接模式打通 OpenClaw 与飞书的操作流程,配置完成后,可在飞书私聊、群组内发送指令,调用本地 AI 实现电脑自动化操作。整体流程分为飞书平台创建应用、权限配置、密钥填写三大环节…

2026/6/17 10:40:20阅读更多 →
嵌入式处理器技术演进与飞思卡尔实战解析:从架构选型到系统设计

嵌入式处理器技术演进与飞思卡尔实战解析:从架构选型到系统设计

1. 嵌入式处理器:从“大脑”到“神经系统”的进化 在电子设备无处不在的今天,我们很少会去思考一个智能设备是如何“思考”和“行动”的。无论是汽车引擎的精准控制、工厂机械臂的流畅运转,还是智能家居的自动响应,其背后都离不开…

2026/6/17 10:40:20阅读更多 →
如何高效使用BallonTranslator:3分钟完成漫画翻译的完整实用指南

如何高效使用BallonTranslator:3分钟完成漫画翻译的完整实用指南

如何高效使用BallonTranslator:3分钟完成漫画翻译的完整实用指南 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地…

2026/6/17 10:40:20阅读更多 →