• 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);

      

     

  • 相关阅读:
    Memcached安装
    BarCode条形码生成库
    WebAPI示例
    JDK安装目录分析-两个jre和三个lib
    JDK安装与环境变量配置
    【Selenium专题】高亮显示页面元素
    cannot be resolved to a type (Java)
    Java中获取运行代码的类名、方法名
    【Selenium专题】 FAQ_对象识别_Compound class names are not supported
    Html5新标签解释及用法
  • 原文地址:https://www.cnblogs.com/karila/p/7872958.html
Copyright © 2020-2023  润新知