当前位置:首页 > VUE

vue 代理实现原理

2026-01-19 03:29:17VUE

Vue 代理实现原理

Vue 的代理机制主要用于实现响应式系统,核心是通过 Object.definePropertyProxy 拦截对象属性的访问和修改,从而触发依赖收集和更新。

基于 Object.defineProperty 的实现

Vue 2.x 使用 Object.defineProperty 对对象的属性进行劫持。通过递归遍历对象的属性,将其转换为 getter/setter,在属性被访问或修改时触发依赖追踪和更新。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function() {
      console.log('get:', key);
      return val;
    },
    set: function(newVal) {
      if (val === newVal) return;
      console.log('set:', key, newVal);
      val = newVal;
    }
  });
}

基于 Proxy 的实现

Vue 3.x 使用 Proxy 实现更强大的代理功能。Proxy 可以直接代理整个对象,无需递归遍历属性,且能拦截更多操作(如数组方法、属性删除等)。

const handler = {
  get(target, key) {
    console.log('get:', key);
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    console.log('set:', key, value);
    return Reflect.set(target, key, value);
  }
};

const proxy = new Proxy({}, handler);

依赖收集与触发更新

无论是 Object.defineProperty 还是 Proxy,核心目标都是实现依赖收集和更新触发:

vue 代理实现原理

  • 依赖收集:在 getter 中记录当前正在执行的 Watcher。
  • 触发更新:在 setter 中通知所有依赖的 Watcher 执行更新。
// 简化的依赖收集逻辑
class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (currentWatcher) {
      this.subscribers.add(currentWatcher);
    }
  }
  notify() {
    this.subscribers.forEach(watcher => watcher.update());
  }
}

总结

Vue 的代理实现原理是通过拦截对象属性的访问和修改,结合依赖收集机制,实现数据变化时的自动更新。Vue 2.x 使用 Object.defineProperty,而 Vue 3.x 升级为 Proxy,提供了更全面的拦截能力和性能优化。

标签: 原理vue
分享给朋友:

相关文章

vue核心实现原理详解

vue核心实现原理详解

Vue核心实现原理 Vue.js的核心实现原理主要包括响应式系统、虚拟DOM、模板编译和组件化机制。以下是对这些核心原理的详细解析: 响应式系统 Vue的响应式系统基于Object.definePr…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue实现颜色

vue实现颜色

Vue 实现颜色的方法 在 Vue 中实现颜色管理可以通过多种方式,以下是一些常见的方法: 使用 CSS 变量动态绑定颜色 在 Vue 组件的样式中定义 CSS 变量,并通过 Vue 的数据绑定动态…

vue实现toggle

vue实现toggle

Vue 实现 Toggle 功能 在 Vue 中实现 toggle(切换)功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 和 v-on 通过 v-model 绑定数据,结合…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…