赞
踩
什么是Proxy
Proxy是ES6推出的一个类,给对象架设一层拦截器,但凡要访问
或者修改
这个对象上的值或者属性,都必须先经过这层拦截器, Proxy也叫代理器
, 它代理了对对象的操作
什么是Object.defineProperty
Object.defineProperty是对对象上的属性进行新增或者修改
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
ownKeys、deleteProperty、has
等是 Object.defineProperty
不具备的。Object.defineProperty
只能遍历对象属性直接修改;Object.defineProperty 的优势如下
- 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
来实现响应式的。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。