当前位置:首页 > VUE

vue 代理实现原理

2026-01-19 03:29:17VUE

Vue 代理实现原理

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

vue 代理实现原理

基于 Object.defineProperty 的实现

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

vue 代理实现原理

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,核心目标都是实现依赖收集和更新触发:

  • 依赖收集:在 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 实现屏幕共享的方法 使用 WebRTC 和 getDisplayMedia API 通过 navigator.mediaDevices.getDisplayMedia 捕获屏幕内容,结合 We…

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return {…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现…

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind…