理解javascript代理基础和反射

理解javascript代理基础

这里的代理是对于对象的代理,这个代理其实和对象属性的访问器属性差不多,可以类比去理解
一、创建空代理——就是设置代理的第二个参数是一个空的对象字面量

<script>
    let target = {
    
      id:"201902091"
    }
    let handler ={
    }
    let proxy = new Proxy(target,handler);
    console.log(target.id);
    console.log(proxy.id);
    target.id =201902000;
    console.log(target.id);
    console.log(proxy.id);
    proxy.id = 201902001;
    console.log(target.id);
    console.log(proxy.id);
    console.log(target == proxy);  //这样就会区分代理和目标
    console.log(proxy.prototype);  //这说明不可以对代理对象使用instanceof方法
</script>

这里设置空的代理对象,第一个参数是需要代理的对象名,当设置为空代理的时候,则第二个处理对象设置成空对象。
②当更改目标对象的属性的时候,代理对象的属性也会随着改变。
③当我们使用proxy.prototype打印时,出现undefined,则可以知道对于代理对象不能使用instanceof方法。
二、2、定义捕获器 理解捕获器概念:当我获取代理对象中的属性的时候,触发捕获器中的get方法

<script>
    let target = {
    
      foo:"bar",
    }
    handler = {
    
      get(){
    
        return "handler override"
      }
    }
    let proxy = new Proxy(target,handler);                         
    console.log(target.foo);
    console.log(proxy.foo);

    console.log(target['foo']);
    console.log(proxy['foo']);

    console.log(Object.create(target)['foo']);
    console.log(Object.create(proxy)['foo']);
</script>

当通过代理对象来打印属性的时候,就会触发get()方法,从而返回相应的字符串。
三、捕获器API ,get传入三个参数

<script>
 const target = {
    
      foo:"bar",
      name:"dl"
    }
    const handler = {
    
      get(target,property,proxy){
    
        console.log(target);
        console.log(property);
        console.log(proxy);
        return "aaa";
      }
    }
    const proxy = new Proxy(target,handler);
    console.log(proxy.foo);
</script>

这里传入三个参数,第一个参数是target:是被代理的对象,第二个参数是访问的属性,第三个参数是该代理的对象。

四、代理访问对象属性的两种方法

<script>
const target ={
    
      name:"domng",
    }
    const handler = {
    
      get(target,property,proxy){
    
        return target[property];
      }
    }
    const proxy = new Proxy(target,handler);
    console.log(proxy.name);
</script>
<script>
const target = {
    
      foo:"bar"
    }
    const handler = {
    
      get(){
    
        return Reflect.get(...arguments);
      }
    }
    const proxy = new Proxy(target,handler);
    console.log(proxy.foo);
</script>

五、多个代理可以形成拦截网

<script>
const target = {
    
      name:"DX",
    }
    const fristProxy = new Proxy(target,{
    
      get(){
    
        console.log("first Proxy");
        return Reflect.get(...arguments);
      }
    })
    const secondProxy = new Proxy(fristProxy,{
    
      get(){
    
        console.log("second Proxy");
        return Reflect.get(...arguments);
      }
    })
    console.log(secondProxy.name);
</script>

这里设置两个代理,fristProxy代理target的代理,secondProxy是firstProxy的代理,这样当访问secodeProxy就会经过fristProxy和target来进行设置。

六、代理的不足


                
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值