zoukankan      html  css  js  c++  java
  • 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);

      

     

  • 相关阅读:
    附加数据库 对于 服务器“00-PC”失败
    SQL 语句转换格式函数Cast、Convert
    sql语句:union
    ISNULL-sqlserver语句
    SQL中的CASE WHEN语句
    SQL SELECT INTO 语句
    Sql语句中IN等方面的用法
    combobox的不常用的方法和将txt文本内容加到textbox中显示
    程序员:“菜鸟”和“大神”差距在哪
    过劳死离我们有多远?
  • 原文地址:https://www.cnblogs.com/karila/p/7872958.html
Copyright © 2011-2022 走看看