Vue2方式:
使用的Object.defineProperty来做的,在页面刚开始加载时,vue会遍历data中的所有属性,然后使用Object.defineProperty把这些属性全部转换为getter/setter,当用户访问这些属性时,会触发对应的getter/setter方法,然后会通知每个组件实例对应的一个watch方法,最后实现视图的更新
但是Object.defineProperty也有缺点,主要有三:
1、对于复杂对象,需要深入监听,一次性监听到底,它的计算量是很大的
2、对于对象新增删除属性它是无法监听的,需要使用Vue.$set和Vue.$delete来作为辅助
3、需要重写数组原生方法,来实现数组的监听
Vue3方式:
使用来proxy代替Object.defineProperty,其优势如下:
1、他可以直接监听整个对象,而不需要遍历监听属性,性能有所提升
2、他可以监听到数组的变化,而不需要去重写数组原生的方法
3、有多达13种拦截方法,它的功能会更加强大