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] = valuereturn 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需要深度遍历每个属性,且对数组的操作很不友好。
