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阅读更多 →
Mermaid Live Editor:告别复杂图表工具,三步实现专业可视化创作

Mermaid Live Editor:告别复杂图表工具,三步实现专业可视化创作

Mermaid Live Editor:告别复杂图表工具,三步实现专业可视化创作 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me…

2026/6/17 17:19:48阅读更多 →
如何快速掌握Outfit字体:设计师的完整免费开源字体指南

如何快速掌握Outfit字体:设计师的完整免费开源字体指南

如何快速掌握Outfit字体:设计师的完整免费开源字体指南 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体是一款专为品牌设计而生的现代几何无衬线字体,拥有从纤细…

2026/6/17 17:19:48阅读更多 →
汽车硬件安全引擎:构建智能汽车纵深防御的信任基石

汽车硬件安全引擎:构建智能汽车纵深防御的信任基石

1. 汽车网络安全:从“附加项”到“生命线”的演进 十年前,当我们谈论汽车安全时,脑海里浮现的可能是安全带、安全气囊和防抱死制动系统。今天,这个定义被彻底颠覆了。随着汽车从“功能机”向“智能机”演进,电子电气架…

2026/6/17 17:19:48阅读更多 →
嵌入式AI推理实战:从模型部署到NXP eIQ环境优化

嵌入式AI推理实战:从模型部署到NXP eIQ环境优化

1. 从云端到边缘:为什么MCU/MPU上的AI推理正在成为主流 几年前,如果你跟嵌入式工程师聊在微控制器上跑神经网络,对方多半会皱起眉头,觉得这要么是天方夜谭,要么是性能鸡肋。但今天,情况已经完全不同。我手头…

2026/6/17 17:19:48阅读更多 →
Mythos安全AI:从漏洞发现到自动利用的范式跃迁

Mythos安全AI:从漏洞发现到自动利用的范式跃迁

1. 这不是一次普通模型发布:Mythos 的真实分量,远超新闻稿里的“旗舰”二字 如果你过去三年里持续关注大模型演进,大概率会记得2023年Claude 2发布时那种“稳扎稳打”的观感——推理更连贯、长文本更可靠、越狱难度更高;也记得202…

2026/6/17 17:19:47阅读更多 →
Keras Conv2D张量形状解析:输入、权重与输出的维度逻辑

Keras Conv2D张量形状解析:输入、权重与输出的维度逻辑

1. 为什么搞懂 Conv2D 的张量形状是写好模型的第一道门槛 刚接触 Keras 做图像任务的朋友,十有八九在 Conv2D 层卡过壳:明明代码跑通了,但一打印 model.summary() 就懵——输入 (None, 224, 224, 3) ,输出怎么突然变成 (No…

2026/6/17 17:14:45阅读更多 →
飞书机器人接入 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阅读更多 →