大家有什么不明白的地方可以分享在评论区,大家一起探讨哦~~
(如果对数据劫持还有所不明白的小伙伴,可以去看看上一篇文章哦)
在vue2中,是如何对数组进行劫持的呢?
简单代码实现:
在vue2中,不会对数组的每一项数据进行递归Object.defineProperty()
方法劫持,这样是很浪费性能的。而是会重写数组方法(js数组中常用的那七种方法)来进行劫持。
当数据为数组时,修改数组的原型为新数组原型(newsArrayProto),而newsArrayProto是在原来的基础上对数组方法进行了加工重写(看代码中的16-21行)。
那我们来看看源码吧!
源码:baseHandlers.ts - vuejs/core - GitHub1s
可以看到,在画红线的地方进行判断是否为数组类型(多余的代码不必纠结,感兴趣的小伙伴可以自己去推敲)。
在59行判断是否支持原型,因为要考虑兼容性的问题。
支持时,61行中将原数组原型修改为加工好的新数组原型,arrayMethods就是已经将数组方法重写好了的数组原型;不支持的话,采用循环的方式,重写修改每一项数组数据的数组方法。
在71行,调用方法,还会继续遍历递归数组中的每一项数据,判断是否有数据为对象或数组类型。
如果是基本数据类型,随着大箭头的方向,来到最顶部就会结束了。
代码如下: