代理与反射(Proxy&Reflect)

  1. 代理是目标对象的抽象。目标对象可以直接被操作,也可以通过代理来操作。
  2. 代理通过Proxy构造函数创建。接受两个参数,分别是目标对象和处理程序对象。const person = { name:'张三', age:18 } const proxy = new Proxy(person,{})
  3. const person = {
        name:'张三',
        age:18
    }
    //创建p为person的空代理,修改p的值,person也会变化
    const p = new Proxy(person,{})
  4. 捕获器(在处理程序中定义的基本操作的拦截器),每次在代理对象上调用这些基本操作时,代理可以在这些操作传播至目标对象之前调用捕获器函数,从而拦截修改相应的行为。
  5. const person = {
        name:'张三',
        age:18
    }
    //创建p为person的空代理,修改p的值,person也会变化
    const p = new Proxy(person,{
        //get方法会接受三个参数,分别是目标对象,要查询的属性,代理对象。
        //通过这三个参数,可以重建被捕获方法的原始行为
        //get(目标对象,要查询的属性,代理对象){ 
        //}
        get(trapTarget, property, receiver) { 
             return trapTarget[property]; 
        }
        set(){
        }
    })
  6. 手动重建原始行为比较困难。可以通过Reflect对象上封装的同名方法轻松重建。

  7. 捕获器不变式,防止捕获器定义时出现过于反常的行为。比如,当目标对象有一个不可配置且不可写的属性时,如果捕获器返回一个与该属性不同的值时,会抛出错误。

  8. 可撤销代理,中断代理对象与目标对象之间的关系。通过revocable()方法实现。代理撤销是不可逆的,撤销后再使用代理,会报错。

    const target = { 
     foo: 'bar' 
    }; 
    const handler = { 
     get() { 
     return 'intercepted'; 
     } 
    }; 
    const { proxy, revoke } = Proxy.revocable(target, handler); 
    console.log(proxy.foo); // intercepted 
    console.log(target.foo); // bar 
    revoke(); 
    console.log(proxy.foo); // TypeError
  9. 反射API与对象API,反射API并不仅限于捕获处理程序,大多数反射API方法在Object类型上有对应的方法。很多反射方法返回状态标记布尔值,表示执行的操作是否成功,执行失败知识会返回false,而不是报错终止代码执行。而对象API执行错误后就直接终止了,程序不够健壮。

     Reflect.get():可以替代对象属性访问操作符。
     Reflect.set():可以替代=赋值操作符。
     Reflect.has():可以替代 in 操作符或 with()。
     Reflect.deleteProperty():可以替代 delete 操作符。
     Reflect.construct():可以替代 new 操作符。
  10. 代理另一个代理。在一个对象上构建多层拦截网。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值