Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找,赋值,枚举,函数操作等)
Reflect是一个内置对象,它提供拦截JavaScript操作的方法,这些方法和Proxy handlers相同。
Reflect.set(target,propertyKey,value[,recevier])
什么是代理:
代理就是我帮你去做事情。
看代码
const dinner = {
meal: 'tacos'
}
const handler = {
get(target, prop) {
console.log('get...', prop)
//return target[prop]
return Reflect.get(...arguments)
},
set(target, key, value) {
console.log('set...', key, value)
//target[key] = value
return Reflect.set(...arguments)
}
}
const proxy = new Proxy(dinner, handler)
console.log(proxy.meal)
我们创建了一个proxy作为dinner的代理,我们对dinner属性的所有操作,都交给了proxy的handler。当我们打印proxy的meal的时候,就会去执行handler里面的get方法。
Proxy和Object.defineProperty相比有什么优点
proxy可以劫持整个对象,而define Property只能劫持对象的属性。
proxy递归返回属性对应的值的代理即可实现响应式
defin Property需要深度遍历每个属性,且对数组的操作很不友好。