Skip to content

监测数组 ​

本节目标:理解“监测数组”的核心思路,并能把它用于实际开发或面试表达。

说明:原 OneNote 中有图片引用,但图片未包含在导出目录中;本页保留了可用的文字与代码内容。 数组也可能使用defineProperty,但我们很少采用arr[232]=233去修改数组元素。但确实是可以使用的,由于这种通过索引操作数组元素的使用方式很低,所以源码中没有采用这种方式。

数组的话,修改索引 不会导致视图更新,修改length也不会更新; 但在vue3中,为了兼容proxy,内部对数组用的就是defineProperty;

正常用户修改数组,主要采用数组的变异方法,就是会改变原数组的七个方法:

  • Push
  • Pop
  • Shift
  • Unshift
  • Splice
  • Sort
  • Reverse

如果是数组,重写数组的原型方法;

如果对数组增加元素时,我们要检查新增元素的类型,如果是对象类型,即对象或数组,我们要进行属性劫持。即使用obserArray方法:

为了能访问Observer的实例方法,我们在每个属性上加上一个__ob__属性,这个属性的值指向Observer实例,这样就可以调用实例方法了;这个__ob__属性还能表示此属性被观测过:

由于 Value.ob=this 给所有属性增加了一个__ob__属性,这个属性的反复遍历会造成死循环,所以我们对__ob__的属性定义为不可枚举,这样就不会被遍历,造成死循环。

本站总访问 — 次