Vue Proxy与defineProperty

242 阅读1分钟
  • Vue 2.x 利用 Object.defineProperty(),并且把内部解耦为 Observer, Dep, 并使用 Watcher 相连
  • Vue 在 3.x 版本之后改用 Proxy 进行实现

Object.defineProperty

Object.defineProperty() 的问题主要有三个:

  1. 不能监听数组的变化
  2. 必须遍历对象的每个属性
  3. 必须深层遍历嵌套的对象

不能监听数组变化

数组的这些方法是无法触发set的:push, pop, shift, unshift,splice, sort, reverse.

必须遍历对象的每个属性

使用 Object.defineProperty() 多数要配合 Object.keys() 和遍历,,于是多了一层嵌套

必须深层遍历嵌套的对象

当一个对象为深层嵌套的时候,必须进行逐层遍历,直到把每个对象的每个属性都调用 Object.defineProperty() 为止。 Vue 的源码中这样的逻辑----walk 方法.

//深层嵌套
let ccobj = {
  cmm: {
    name: 'kskjkjkjdfg'
  }
}

Proxy

Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。