Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找,赋值,枚举,函数操作等)

Reflect是一个内置对象,它提供拦截JavaScript操作的方法,这些方法和Proxy handlers相同。

  1. Reflect.set(target,propertyKey,value[,recevier])

什么是代理:
代理就是我帮你去做事情。
看代码

  1. const dinner = {
  2. meal: 'tacos'
  3. }
  4. const handler = {
  5. get(target, prop) {
  6. console.log('get...', prop)
  7. //return target[prop]
  8. return Reflect.get(...arguments)
  9. },
  10. set(target, key, value) {
  11. console.log('set...', key, value)
  12. //target[key] = value
  13. return Reflect.set(...arguments)
  14. }
  15. }
  16. const proxy = new Proxy(dinner, handler)
  17. console.log(proxy.meal)

我们创建了一个proxy作为dinner的代理,我们对dinner属性的所有操作,都交给了proxy的handler。当我们打印proxy的meal的时候,就会去执行handler里面的get方法。

Proxy和Object.defineProperty相比有什么优点

proxy可以劫持整个对象,而define Property只能劫持对象的属性。
proxy递归返回属性对应的值的代理即可实现响应式
defin Property需要深度遍历每个属性,且对数组的操作很不友好。