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);
    }
  • 相关阅读:
    UI自动化web端框架config.json代码
    UI自动化web端框架run.py代码
    UI自动化web端框架核心组成和目录结构
    appium环境搭建(windows-appium-android)
    官网pyse的修改版
    git安装和使用、python安装
    单例设计模式、工厂设计模式和装饰器
    AcWing 245 你能回答这些问题吗? (线段树)
    AcWing 244 谜一样的牛 (线段树)
    AcWing 239 奇偶游戏 (带权并查集 / 扩展域并查集)
  • 原文地址:https://www.cnblogs.com/qdlhj/p/9924610.html
Copyright © 2011-2022 走看看