es6 Proxy和Reflect(十一)

Proxy:代理

{
    let obj = {//供应商对象
        time:'2017-2-1',
        name:'net',
        _r:123
    };
    let monitor = new Proxy(obj,{//obj:要代理的供应商对象
        //拦截对象属性的读取
        get(target,key){
            return target[key].replace('2017','2018')
        },
        //拦截对象设置属性
        set(target,key,value){//target:obj
            if(key === 'name'){//只能修改name属性
                return target[key] = value;
            }else{
                return target[key];
            }
        },
        //拦截key in object操作
        has(target,key){
            if(key === 'name'){//只暴露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');//filter过滤函数
        }
    });
    console.log('get',monitor.time)//obj对用户是不可见的,用户读取的是obj通过Proxy的映射

    monitor.time = '2019';
    monitor.name = '慕课网';
    console.log('set',monitor.time,monitor.name);

    console.log('has','name' in monitor,'item' in monitor);

    delete monitor.time;
    console.log('delete',monitor);

    delete monitor._r;
    console.log('delete',monitor);

    console.log('ownKeys',Object.keys(monitor));//只返回了name,_r,time被保护起来
}

Reflect:反射

es6 Proxy和Reflect(十一)

两者对象的方法是一样的。