vue3响应式 · Vladimirirr/Sealeded · Discussion #3 · GitHub
我们从以下这些点回答:
覆盖率
Proxy 是 ES6 规范里的,当然现在的浏览器已经都支持 ES6 了,可是 Vue2 刚出来的时候浏览器对 ES6 的支持都不高。
defineProperty 方法是 ES5 规范里的,而 ES5 发布于 2011 年,浏览器已经都支持了!
Vue2 当时要与其他的框架竞争(比如,react.js、ember.js、angular.js、backbone.js、等等),必须有足够强大的浏览器兼容性。
Proxy 是语法特性,因此不能被 Polyfill!
语法本质
Proxy 本质是代理一个对象(即观察一个对象,以前 JavaScript 有一个 Object.observe 的提案,专门来观察一个对象的变化,类似 DOM 树的 MutationObserver,不过此提案没有实现),与对象相关的全部操作都能被 Proxy 捕获,就包括了最基本的 get 与 set 操作。此外,Proxy 是 JavaScript 的元编程技术的基建,与 Reflect 一起使用。
defineProperty 本质是定义和修改对象 property 的描述符,而描述符里的种类包括 getter 与 setter,恰好可以观察一个对象的读与写的操作。
我们从以下这些点回答:
覆盖率
Proxy 是 ES6 规范里的,当然现在的浏览器已经都支持 ES6 了,可是 Vue2 刚出来的时候浏览器对 ES6 的支持都不高。
defineProperty 方法是 ES5 规范里的,而 ES5 发布于 2011 年,浏览器已经都支持了!
Vue2 当时要与其他的框架竞争(比如,react.js、ember.js、angular.js、backbone.js、等等),必须有足够强大的浏览器兼容性。
Proxy 是语法特性,因此不能被 Polyfill!
语法本质
Proxy 本质是代理一个对象(即观察一个对象,以前 JavaScript 有一个 Object.observe 的提案,专门来观察一个对象的变化,类似 DOM 树的 MutationObserver,不过此提案没有实现),与对象相关的全部操作都能被 Proxy 捕获,就包括了最基本的 get 与 set 操作。此外,Proxy 是 JavaScript 的元编程技术的基建,与 Reflect 一起使用。
defineProperty 本质是定义和修改对象 property 的描述符,而描述符里的种类包括 getter 与 setter,恰好可以观察一个对象的读与写的操作。