为什么vue2中 不能用Object.defineProperty劫持数组

7 阅读1分钟

为什么vue2中 不能用Object.defineProperty劫持数组

  • 因为Object.defineProperty是通过劫持对象属性来更改视图的。
  • 在数组中,length就是它的属性,而length是个特殊的值,随着数组的增大,使用Object.defineProperty来监听数组下标,就会消耗更高的性能,导致框架性能不稳定,且数组的一些方法,例如push(),splice(),都是直接操作数组本身的,Object.defineProperty()无法监听到数组变化。
  • 所以Object.defineProperty不适合监听数组下标。
  • vue2为了提高用户使用体验,采用set来手动控制响应式更新。这是因为gettersetter只会监听初始化数据,所以新增属性或数组元素的变化时(例如使用数组的一些变异方法,例如push()splice())gettersetter监听不到变化,此时使用set来手动控制响应式更新。这是因为getter和setter只会监听初始化数据,所以新增属性或数组元素的变化时(例如使用数组的一些变异方法,例如push(),splice()) getter和setter监听不到变化,此时使用set手动控制响应式更新,并为其添加getter和setter,确保其后续是响应式的。
  • 总结:不是Object.defineProperty不能监听数组下标,而是vue2没有用它来监听数组下标。