Proxy
Proxy的监听是针对一个对象的,那么对这个对象的所有操作会进入监听操作,这就完全可以代理所有属性了
下面通过代码进行展示:
定义一个响应式方法reactive
1 | function reactive(obj) { |
测试一下简单数据的操作,发现都能劫持
1 | const state = reactive({ |
再测试嵌套对象情况,这时候发现就不那么 OK 了
1 | const state = reactive({ |
如果要解决,需要在get之上再进行一层代理
1 | function reactive(obj) { |
三、总结
Object.defineProperty只能遍历对象属性进行劫持
1 | function observe(obj) { |
Proxy直接可以劫持整个对象,并返回一个新对象,我们可以只操作新的对象达到响应式目的
1 | function reactive(obj) { |
Proxy可以直接监听数组的变化(push、shift、splice)
1 | const obj = [1,2,3] |
Proxy有多达13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等,这是Object.defineProperty不具备的
正因为defineProperty自身的缺陷,导致Vue2在实现响应式过程需要实现其他的方法辅助(如重写数组方法、增加额外set、delete方法)
1 | // 数组重写 |
Proxy 不兼容IE,也没有 polyfill, defineProperty 能支持到IE9