Vue 3 响应式系统必须使用 Reflect.get/set,因其与 Proxy 天然配套:保证原型链、this 绑定等行为一致;set 返回布尔值便于错误处理;receiver 参数确保嵌套代理中 this 正确;get 触发依赖收集并自动 reactive 深层对象;set 对比新旧值(严格相等)后写入并触发更新。

Vue 3 的响应式系统靠 Proxy 拦截对象操作,而 Reflect.get 和 Reflect.set 是它内部真正读写数据的“执行引擎”——不是可选工具,而是必须使用的标准方式。
为什么必须用 Reflect.get/set,而不是直接 target[key]?
直接访问或赋值会绕过 Proxy 拦截,导致依赖收集和更新通知失效。而 Reflect.get(target, key, receiver) 和 Reflect.set(target, key, value, receiver) 是 ES6 规范中与 Proxy 配套的标准 API,它们能保证:
- 行为与原生操作一致(比如处理原型链、
this绑定); - 返回布尔值(
set成功返回true,失败返回false),便于错误判断; - receiver 参数确保在嵌套代理中正确传递代理实例,避免 this 指向丢失;
- 与 Proxy handler 的参数签名完全匹配,天然适配拦截逻辑。
get 中的 Reflect.get 干了什么?
它不只是取值,而是整个依赖收集链条的起点:
- 先调用
track(target, key),把当前正在运行的副作用(如组件渲染函数)记入该属性的依赖集合; - 再执行
Reflect.get(target, key, receiver)获取原始值; - 如果返回值是对象,自动递归调用
reactive()包装,确保深层属性也具备响应能力; - 整个过程对开发者透明,你写
state.user.name,就自然触发了三层代理的 get 拦截。
set 中的 Reflect.set 如何触发更新?
它承担“变更确认 + 通知调度”的双重职责:
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
立即学习“前端免费学习笔记(深入)”;
- 先用
Reflect.get(target, key)拿旧值,对比新旧值(严格相等,!==); - 仅当确实变化时,才执行
Reflect.set(target, key, value, receiver)写入; - 随后立即调用
trigger(target, key),查出所有监听该target.key的 effect(组件、watch、computed),逐个重新执行; - 注意:不比较引用类型内容(如对象内部字段),只比内存地址——这也是为什么修改对象内部属性需用
reactive或ref包裹。
实际代码里它们长什么样?
简化版 handler 示例:
const handler = {
get(target, key, receiver) {
track(target, key);
const res = Reflect.get(target, key, receiver);
return typeof res === 'object' && res !== null ? reactive(res) : res;
},
set(target, key, value, receiver) {
const oldValue = Reflect.get(target, key, receiver);
if (value !== oldValue) {
Reflect.set(target, key, value, receiver);
trigger(target, key);
}
return true;
}
};

















