Object.defineProperty与Proxy的区别

229 阅读1分钟

Vue 2.x 双向数据绑定采用 Object.defineProperty 方法,Vue 3.x采用 Proxy 对象实现双向数据绑定,可以通过Proxy实现数据劫持。

Object.defineProperty

优点:

  • 兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题

缺点:

  • 只能劫持对象的属性,我们需要对每个对象的每个属性进行遍历。

  • 不能直接监听数组,通过重写数组的那几个方法(push,pop,unshift,shift,sort,reverse,splice)来实现数组监听。

  • 也不能对ES6的 Set 和 Map 数据结构进行监听。

  • 也不能监听新增和删除操作,通过 Vue.set()和 Vue.delete来实现响应式的。

Proxy

  • Proxy可以直接监听整个对象而非属性。

  • Proxy可以直接监听数组的变化。

  • Proxy有13中拦截方法,如ownKeys、deleteProperty、has 等是 Object.defineProperty 不具备的。

  • Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改。

  • Proxy做为新标准将受到浏览器产商重点持续的性能优化,也就是传说中的新标准的性能红利。