Vue3.0跟为什么要跟Object.defineProperty说拜拜,而要跟Proxy手拉手

  在上篇文章中,我解释了vue双向绑定的原理,其中大部分都是在讲Object.definePropertyObject.defineProperty本身有一定的监控到数组变化的能力,它本身是可以监控到数组下标的变化的能力的,但是在Vue中,从性能/体验的性价比来考虑,尤雨溪就弃用了这个特性,从而转向了具有更多劫持操作的Proxy。
  既然Object.defineProperty会被取代,那么就肯定有缺点,下面我们一起来看看有哪些缺点:

  • Object.defineProperty无法监控到数组下标的变化,导致直接通过数组的下标给数组设置值,不能实时响应。
      嗯~~~~~~~~,怎么说,在之前我提到了Object.defineProperty可以监控数组变化的能力,但是现在为什么又要这么说,这不得不说segmentfault上的一位大佬hfhan,在hfhan的一篇问答的思考中,详细的解读了为什么说Object.defineProperty是可以监控数组变化的能力的,同时hfhan也在github上提问了尤雨溪,得到的回答是因为性能问题放弃了Object.defineProperty,话不多扯,我会在文末给出hfhan的问答地址,感兴趣的可以看看。
      Object.defineProperty无法监控到数组下标的变化,导致直接通过数组的下标给数组设置值,不能实时响应。 为了解决这个问题,经过vue内部处理后可以使用以下几种方法来监听数组:
push()   pop()   shift()   unshift()   splice()   sort()   reverse()

  在Vue中仅对以上几种方法进行了hack处理,而数组其他的属性并不能被检测到,产生了局限性。

  • Object.defineProperty只能劫持对象的属性,因此需要对每个对象的每个属性进行遍历
      Vue 2.x里,是通过 递归 + 遍历 data 对象来实现对数据的监控的,如果属性值也是对象那么需要深度遍历,显然如果能劫持一个完整的对象是才是更好的选择。

超级无敌分割线

说完了缺点就该说优点了
Proxy的优点:

  • 可以劫持整个对象,并返回一个新对象
  • 有13种劫持操作

作为一个原理解读的文章来说,如此篇幅甚是寒酸,但是把他当作是一道面试题来看,这样的解答很好了,我会将本篇文章归类到面试分类中

传送门:

记一次思否问答的问题思考:Vue为什么不能检测数组变动
Vue双向数据绑定的那些事,真的知道吗?
  其实这篇文章是一个引子,为了引入我的下篇文章,在下篇文章中,我会重点对Proxy做介绍,敬请期待,谢谢您的阅读,祝您代码路上无Bug。

你可能感兴趣的:(面试总结,vue)