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

      

     

  • 相关阅读:
    【Networking】(转)一个非常好的epoll+线程池服务器Demo
    【算法】Logistic regression (逻辑回归) 概述
    【Linux】/dev/null 2>&1 详解
    单点登录与联合登录
    web项目报outmemory错误解决方案
    hadoop学习之HDFS
    ELK日志分析系统
    基于cookie共享的SSO中的遇到的问题
    oracle的隐式游标
    mysql截取字符串与reverse函数
  • 原文地址:https://www.cnblogs.com/karila/p/7872958.html
Copyright © 2011-2022 走看看