什么是Proxy
Proxy是ES6推出的一个类,给对象架设一层拦截器,但凡要访问
或者修改
这个对象上的值或者属性,都必须先经过这层拦截器, Proxy也叫代理器
, 它代理了对对象的操作
什么是Object.defineProperty
Object.defineProperty是对对象上的属性进行新增或者修改
Proxy的优势如下
- Proxy可以直接监听整个对象而非属性。
-
var newProxyObj = {name: 'chrome', age:'0'} var proxyObj = new Proxy(newProxyObj, { set(target, key, value, receiver) { consnole.log('proxy改了', key, value) } }) proxyObj.name = 'google'; // proxy修改了 name google
- Proxy可以直接监听数组的变化。
- Proxy有13中拦截方法,如
ownKeys、deleteProperty、has
等是Object.defineProperty
不具备的。 - Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而
Object.defineProperty
只能遍历对象属性直接修改; - Proxy做为新标准将受到浏览器产商重点持续的性能优化,也就是传说中的新标准的性能红利。
Object.defineProperty 的优势如下
- 兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平。
-
const obj = { name: 'chrome' } // 数据描述符 Object.defineProperty(obj, 'age', { configurable: true, // 这个定义是否可以被delete enumerable: true, // 这个值是否可以被for in 枚举,或者Object.keys获取到 writable: true, // 定义是否可以被修改 value: '100' }) // 访问器描述符 Object.defineProperty(obj, 'child', { configurable: true, enumerable: true, set(value) { console.log(value) }, get() { console.log(this.value) } })
Object.defineProperty 不足在于:
Object.defineProperty
只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。Object.defineProperty
不能监听数组。是通过重写数据的那7个可以改变数据的方法来对数组进行监听的。Object.defineProperty
也不能对es6
新产生的Map
,Set
这些数据结构做出监听。Object.defineProperty
也不能监听新增和删除操作,通过Vue.set()
和Vue.delete
来实现响应式的。