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阅读更多 →
视频画质革命:5个理由选择Video2X实现AI视频放大

视频画质革命:5个理由选择Video2X实现AI视频放大

视频画质革命:5个理由选择Video2X实现AI视频放大 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x …

2026/6/17 16:59:42阅读更多 →
经典MC68HC908GP32评估板与MON08调试接口深度解析

经典MC68HC908GP32评估板与MON08调试接口深度解析

1. 项目概述:从一块经典评估板说起如果你在十几年前接触过Freescale(现NXP)的8位微控制器,那么对MC68HC908GP32这颗芯片和它的官方评估板IDB-HC08GP一定不会陌生。这不是一块追求极致性能的板子,但它却是那个时代嵌入式…

2026/6/17 16:59:42阅读更多 →
第五人格登录助手:3分钟快速登录游戏的终极指南

第五人格登录助手:3分钟快速登录游戏的终极指南

第五人格登录助手:3分钟快速登录游戏的终极指南 【免费下载链接】idv-login idv-login is an IdentityV login tool. 项目地址: https://gitcode.com/gh_mirrors/idv/idv-login 第五人格登录助手(idv-login)是一款专为《第五人格》玩家…

2026/6/17 16:59:42阅读更多 →
免费畅玩Switch游戏:yuzu模拟器完整使用指南

免费畅玩Switch游戏:yuzu模拟器完整使用指南

免费畅玩Switch游戏:yuzu模拟器完整使用指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器是目前最受欢迎的开源任天堂Switch模拟器,让你能够在Windows、Linux和Android设备上流…

2026/6/17 16:59:42阅读更多 →
本地大语言模型推理工具选型指南:Ollama、LM Studio与llama.cpp深度对比

本地大语言模型推理工具选型指南:Ollama、LM Studio与llama.cpp深度对比

1. 为什么“本地LLM推理服务工具”突然成了硬通货?——从一个被反复问爆的问题说起 上周三晚上十一点,我在技术群看到一条消息:“LM Studio装好了,但提示‘no lm runtime found for model format gguf’,重装三次还是…

2026/6/17 16:59:42阅读更多 →
Claude Opus 4.7推理强度调控与结构化开发实践

Claude Opus 4.7推理强度调控与结构化开发实践

1. 项目概述:这不是一次简单的模型升级,而是一次开发范式的迁移最近看到不少朋友在问“Opus 4.7到底值不值得换”、“和3.5比强在哪”、“要不要重写提示词”,我试了整整三周,从写自动化文档生成脚本、到重构一个老项目的技术评审…

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