361 字
2 分钟
Vue 3 响应式原理:Proxy 到底比 defineProperty 强在哪?

告别 $set,拥抱 Proxy#

作为全栈开发者,从 Vue 2 迁移到 Vue 3,最大的爽点之一就是再也不用写 this.$set 了。这背后是响应式系统的根本性变革。

时代的眼泪:Object.defineProperty#

在 Vue 2 时代,尤雨溪利用 Object.defineProperty 劫持了对象的 getset。这很天才,但有硬伤:

  1. 数组监听难:必须重写数组的 7 个变异方法(push, pop…),而且还监听不到数组索引的变化。
  2. 对象新增属性:对象创建后,再给它加个新属性,Vue 是瞎子。所以必须用 Vue.set
  3. 递归性能:初始化时必须递归遍历对象的所有层级,数据量一大,启动就慢。

新皇登基:Proxy#

Vue 3 使用了 ES6 的 Proxy。它不劫持属性,而是直接劫持 整个对象

const handler = {
get(target, key) {
track(target, key) // 收集依赖
return Reflect.get(target, key)
},
set(target, key, value) {
trigger(target, key) // 触发更新
return Reflect.set(target, key, value)
}
}
const proxy = new Proxy(data, handler)

降维打击#

  1. 全方位感知:不管是数组索引、还是对象新增属性,Proxy 都能拦截到。
  2. 懒加载:只有当你访问嵌套对象时,Vue 3 才会临时给那一层做代理。不需要在启动时一次性递归到底。性能提升显著!

所以,兄弟们,如果还在守着 Vue 2 的老项目,是时候考虑重构了。为了那个消失的 $set,也值了。

Vue 3 响应式原理:Proxy 到底比 defineProperty 强在哪?
https://www.oferry.com/posts/a32/
作者
晨平安
发布于
2026-02-05
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00