(二)16.Proxy和Reflect19-08-13

2019-08-15  本文已影响0人  你坤儿姐

Proxy和Reflect
Proxy和Reflect的概念
Proxy :代理
Reflect:反射

{
  //原始对象存储数据
  let obj={
    time:'2017-08-11',
    name:'net2017',
    _r:123
  };

  //创建Proxy代理
  let monitor=new Proxy(obj,{
    //拦截对象属性的读取
    get(target,key) {
      //get是拦截代理所有跟读取相关的属性
      return target [key].replace('2017','2018');//不管拦截什么属性 都把属性中的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.getOwnPropertySymbols Object.getOwnPropertyNames
    ownKeys(target) {
      return Object.keys(target).filter(item=>item!='time')//过滤掉time标签
    }

  });
    // monitor.time//读取monitor的time属性
    console.log('get',monitor.time,monitor.name);
    monitor.time='2018';
    monitor.name='mukewang';
    console.log('set',monitor.time,monitor);

    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('ownKey',Object.keys(monitor));
}

打印结果:

get 2018-08-11 net2018
set 2018-08-11 Proxy {time: "2017-08-11", name: "mukewang", _r: 123}
has true false
//delete Proxy {time: "2017-08-11", name: "mukewang", _r: 123}
//delete Proxy {time: "2017-08-11", name: "mukewang"}
ownKey (2) ["name", "_r"]
{
  //原始对象存储数据
  let obj={
    time:'2017-08-11',
    name:'net2017',
    _r:123
  };
  //get方法
  console.log('Reflect get',Reflect.get(obj,'time'));
  //set方法
  Reflect.set(obj,'name','mukewang');
  console.log(obj);
  console.log('has',Reflect.has(obj,'name'));
}

打印结果:
Reflect get 2017-08-11
{time: "2017-08-11", name: "mukewang", _r: 123}
has true

Proxy和Reflect的试用场景

{
  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('lilei',30);

  console.info(person);

  // person.name=48;  //会报错 因为设置了name必须是字符串
  person.name='Han Mei Mei';
  console.info(person);
}

打印结果:
Proxy {name: "lilei", age: 30}
Proxy {name: "Han Mei Mei", age: 30}

上一篇下一篇

猜你喜欢

热点阅读