es6之proxy和reflect

一、proxy

 //Proxy和Reflect
    //供应商
    let obj={
        time:"2017-11-21",
        name:"net",
        _r:123
    }

    //代理商
    let monitor=new Proxy(obj,{
        //拦截对象属性的读取
        get(target,key){
           return target[key].replace("2017","2018")
        },
        //拦截对象设置属性
        set(target,key,value){
            if(key ==='name'){
                return target[key]=value;
            }else{
                return target[key];
            }
        },
        //拦截key in object操作
        has(target,key){
            if(key === 'name'){
                return target[key];
            }else{
                return false;
            }
        },
        //拦截删除
        deleteProperty(target,key){
            if(key.indexOf('_')>-1){
               delete target[key];
                return true;
            }else{
                return target[key]
            }
        },
        //拦截Object.keys,Object.getOwnPropertySymbol,Object.getOwnPropertyNames
        ownKeys(target){
            return Object.keys(target).filter(item=>item!='time')
        }
    })
    console.log("get",monitor.time);
    monitor.time="2019";
    monitor.name="lalala";
    console.log(monitor.time);
    console.log(monitor.name);
    //monitor.time

    console.log("has","name" in monitor,"time" in monitor);

    /*delete monitor.time
    console.log("delete",monitor);
    delete monitor._r
    console.log("delete",monitor);
    */
    console.log("ownKeys",Object.keys(monitor))

  

二、reflect

方法与proxy一样

let obj={
        time:"2017-11-21",
        name:"net",
        _r:123
    }
    console.log("reflect",Reflect.get(obj,"time"));
    Reflect.set(obj,"name","lalala");
    console.log(obj);
    console.log(Reflect.has(obj,"time"))

 

三、用法

//用法
function validator(target,validator){
return new Proxy(target,{
_validator:validator,
set(target,key,value,proxy){
if(target.hasOwnProperty(key)){
let va=this._validator[key];
if(!!va(value)){
return Reflect.set(target,key,value,proxy)
}else{
throw Error(`不能设置${key}到${value}`)
}
}else{
throw Error(`${key} 不存在`)
}
}
})
}

const personValidators={
name(val){
return typeof val==='string'
},
age(val){
return typeof val==='number' && val>18
}
}

class Person{
constructor(name,age){
this.name=name;
this.age=age;
return validator(this,personValidators)
}
}

const person=new Person("kxx",30);
console.info(person);

person.name="kangxiaoxiao";
person.age=5;
console.info("change",person);

  

 

原文地址:https://www.cnblogs.com/karila/p/7872958.html