BlackHoleMax

BlackHole's Blog

马上订阅 BlackHoleMax RSS 更新: https://blackholemax.github.io/atom.xml

Vue 响应式原理:从 2.x 的 Object.defineProperty 到 3.x 的 Proxy

2025年9月25日 14:00

一张图记住结论:
Vue2 = 递归属性劫持defineProperty
Vue3 = 整体对象代理Proxy


1. 为什么要变?

痛点Vue2 表现Vue3 解决
新增/删除属性不能自动触发更新自动追踪
数组下标/length需要重写 7 个变异方法原生语法直接拦截
深层对象初始化时一次性递归,耗时用到哪层代理哪层(懒代理)
IE 兼容必须支持 IE9只支持现代浏览器

2. Vue2:Object.defineProperty 时代

2.1 核心思路

  1. 遍历 data 所有属性
  2. 为每个属性调用 Object.defineProperty 植入 getter/setter
  3. getter 中收集依赖(Dep.target = Watcher
  4. setter 中派发更新(dep.notify()

2.2 最小实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function defineReactive(obj, key, val) {
const dep = new...

剩余内容已隐藏

查看完整文章以阅读更多