proxy学习笔记

2020-07-11  本文已影响0人  小仙有毒_1991

proxy 在目标对象的外层搭建一层拦截器,外界对目标对象的操作必须经过拦截器。
var proxy = new Proxy(target,handler);

var target ={
    age:30
}

var targetWithLog = new proxy(target,{
    get:function(target,key){
        console.log(`${key} 被读取`);
        return target[key];
    },
    set:function(target,key,value){
        console.log(`${key}设置为${value}`);
        target[key] = value;
    }
})

targetWithLog.age;
targetWithLog.age = 31;
//控制台打印了日志

Proxy实例也可以作为其他对象的原型对象

var proxy = new Proxy({},{
  get:function(target,property){
    return 35;
  }
});

let obj = Object.create(proxy);

obj.time// 35

上述的get、set是不可以自定义的,是handler的13个api方法:

// 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。
handler.has()
// 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。
handler.get()
// 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。
handler.set()

提到这里还要提一下Reflect对象,它是ES7新的内置对象,不能new,使用方法同Object。

let obj = {
    name:'李四',
    age:20
}
Reflect.set(obj,'name','张三')    // true,修改成功返回true
console.log(obj)    /

下来我们来实现一下私有变量拦截

let api = {
 _apiKey:'11',
 getUser:function(){},
 setUser:function(){}
}
let apiProxy = new Proxy(api,{
 has:function(target,key){
    if(key === '_apiKey'){
      return false;
    }else{
      Reflect.has(target,key);
    }
 }
})

console.log('_apiKey' in apiProxy );//false
上一篇下一篇

猜你喜欢

热点阅读