zoukankan      html  css  js  c++  java
  • ES6学习笔记三(proxy和reflect)

    proxy用法

    // 代理
    {
        let obj={
            time:'2017-03-11',
            name:'net',
            _r:123
        };
    
        let monitor=new Proxy(obj,{
            // 拦截对象属性的读取
            get(target,key){
                return target[key].replace('2017','2018')  //将目标对象中的2017都换成2018
            },
            // 拦截对象设置属性
            set(target,key,value){
                if(key==='name'){
                    return target[key]=value;  //当key值为name时会被修改value值
                }else {
                    return target[key];
                }
            },
            // 拦截key in object操作判断是否属于object的某个属性
            has(target,key){
                if(key==='name'){
                    return target[key]
                }else {
                    return false;
                }
            },
            // 拦截delete
            deleteProperty(target,key){
                if(key.indexOf('_') > -1){
                    delete target[key];
                    return true;
                }else {
                    return target[key]
                }
            },
            // 保护属性 拦截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
            ownKeys(target){
                return Object.keys(target).filter(item=>item!='time')
            }
        });
    
        console.log('get',monitor.time);
    
        monitor.time='2019';  
        monitor.name='mukewan';
        console.log('set',monitor.time,monitor);  //set 2018-03-11 Proxy {time: "2017-03-11", name: "mukewan", _r: 123}
    
        console.log('has','name' in monitor,'time' in monitor);  //true  false
    
        // delete monitor.time;
        // console.log('delete',monitor);  //还是存在,没被删掉
    
        // delete monitor.time;
        // console.log('delete',monitor);
    
        // delete monitor._r这一项;
        // console.log('delete',monitor); //发现被删除了_r这一项
    
        console.log('ownKeys',Object.keys(monitor)); //["name", "_r"] time被保护
    }

    Reflect

    Reflect用法跟Proxy一样,他有的方法他都有,使用起来更简单

    {
        let obj={
            time:'2017-03-11',
            name:'net',
            _r:123
        };
        console.log('Reflect get',Reflect.get(obj,'time'));
        Reflect.set(obj,'name','mukewan');
        console.log(obj);
        console.log('has',Reflect.has(obj,'name'));
    }

    应用场景 数据校验

    {
        function validator(target,validator){
            return new Proxy(target,{
                _validator:validator,
                set(target,key,value,proxy){
                    if (target,key,value,proxy) {
                        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
            },
            mobile(val)    {
    
            }
        }
    
        class Person {
            constructor(name,age){
                this.name=name;
                this.age=age;
                return validator(this,personValidators)
            }
        }
    
        const person=new Person('lilei',30);
        console.log(person);
        person.name='Han mei mei';
    
        console.log(person);
    }
  • 相关阅读:
    bWAPP练习--injection篇SQL Injection (GET/Search)
    利用gmpy2破解rsa
    Linux 下安装gmpy2
    Linux下安装scapy-python3
    python升级带来的yum异常:File "/usr/bin/yum", line 30
    CentOS7 安装Python3.6.4
    bWAPP练习--injection篇之HTML Injection
    kali2.0安装VMware Tools
    Lombok插件看法浅谈
    记一次Java动态代理实践【首发自高可用架构公众号】
  • 原文地址:https://www.cnblogs.com/qdlhj/p/9924610.html
Copyright © 2011-2022 走看看