Object.defineProperty()

vue2 采用 Object.defineProperty() 进行数据劫持

Proxy

vue3 采用 proxy 进行数据劫持。
vue3 之所以采用 Proxy 类主要有两个原因:

  • 可以提升性能, Vue2 是通过层层递归的方式对数据进行劫持,并且数据劫持一开始就要进行层层递归(一次性递归),如果对象的路径非常深将会非常影响性能。而 Proxy 可以在用到数据的时候再进行对下一层属性的劫持。
  • Proxy 可以实现对整个对象的劫持,而 Object.defineProperty() 只能实现对对象的属性进行劫持。所以对于对象上的方法或者新增、删除的属性则无能为力。

https://segmentfault.com/a/1190000023380448