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:反射
两者对象的方法是一样的。