当前位置:首页 > VUE

vue observer实现

2026-03-27 14:33:48VUE

Vue Observer 实现原理

Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现的 Observer 模式。以下是关键实现细节:

Vue 2.x 的 Observer

数据劫持 通过 Object.defineProperty 递归地将对象的属性转换为 getter/setter:

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

依赖收集 每个属性维护一个 Dep 实例,用于存储依赖(Watcher):

class Dep {
  constructor() {
    this.subs = new Set();
  }
  addSub(sub) {
    this.subs.add(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

Observer 类 递归观测整个对象:

class Observer {
  constructor(value) {
    this.walk(value);
  }
  walk(obj) {
    Object.keys(obj).forEach(key => {
      defineReactive(obj, key, obj[key]);
    });
  }
}

Vue 3.x 的 Observer

Proxy 实现 改用 Proxy 实现数据劫持,解决 Vue 2.x 的局限性(如数组检测、新增属性等):

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 依赖收集
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    }
  });
}

Effect 系统 使用 effect 替代 Watcher,基于 Proxy 的响应式更高效:

vue observer实现

let activeEffect;
function effect(fn) {
  activeEffect = fn;
  fn();
  activeEffect = null;
}

关键差异对比

  • 性能:Proxy 无需递归初始化全部属性,按需响应
  • 数组处理:Proxy 直接支持数组索引修改和 push 等方法
  • API 设计:Vue 3.x 的 reactive/ref 更灵活,兼容组合式 API

实现注意事项

  1. 避免循环引用导致栈溢出
  2. __proto__ 等特殊属性需做安全处理
  3. 嵌套对象的深度观测需要惰性化以优化性能

完整实现需结合虚拟 DOM 和调度系统,但以上代码已展示核心响应式原理。实际开发中建议直接使用 Vue 提供的 API,而非手动实现。

标签: vueobserver
分享给朋友:

相关文章

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue监听实现

vue监听实现

Vue 监听实现方法 在 Vue 中可以通过多种方式实现监听数据变化或事件触发,以下是常见的几种方法: 使用 watch 选项 watch 是 Vue 提供的核心功能之一,用于观察和响应 Vue 实…

vue实现特效轮播

vue实现特效轮播

Vue实现特效轮播的方法 使用Vue实现轮播效果可以通过多种方式完成,以下是几种常见的实现方法。 使用Vue和CSS动画 通过Vue的动态绑定和CSS动画结合,可以实现平滑的轮播效果。 <t…

vue实现购物平台

vue实现购物平台

实现购物平台的基本架构 使用Vue.js构建购物平台需要结合前端框架、状态管理、路由和后端接口。以下是一个基本实现方案: 项目初始化与依赖安装 通过Vue CLI创建项目并安装必要依赖: vue…

vue实现滑块选择

vue实现滑块选择

实现滑块选择的基本思路 在Vue中实现滑块选择功能,可以通过使用原生HTML的<input type="range">元素或第三方UI库(如Element UI、Vuetify等)提供的滑…

vue新增表单实现

vue新增表单实现

Vue 表单实现方法 使用 Vue 实现新增表单功能可以通过多种方式完成,以下是一些常见的方法和步骤: 使用 v-model 双向绑定 在 Vue 中,v-model 指令可以实现表单输入和应用状态…