美文网首页
(二)16.Proxy和Reflect19-08-13

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

作者: 你坤儿姐 | 来源:发表于2019-08-15 09:33 被阅读0次

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

  • Proxy
{
  //原始对象存储数据
  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"]
  • Reflect
{
  //原始对象存储数据
  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}

相关文章

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

    Proxy和ReflectProxy和Reflect的概念Proxy :代理Reflect:反射 Proxy 打印...

  • 二和不二

    近读佛法,偶有所感,勉力写来,不足之处,诸君见谅。 大家都了解“不二”是佛家语,而相应的“二”则是世间...

  • 二狗和二虎

    碰巧的是,这俩哥哥家的二胎之间不知何时起,竟有了顾盼。 给孩子们照毕业照那天,妙儿按不住得非要拱...

  • 阿和(二)

    当唱到第二首的时候,室友拉着阿和走了过来。在操场阴暗不明的灯光下,依稀看出那边一群人围着那边几个帅气小伙在那里表演...

  • 丁二和

    题目:二和的泪 正文:丁二和是游曳在苍茫人海中的孤独者。他年轻的背影在暗夜里独自对月徘徊,他心中的苦闷假使全部消散...

  • 和吾师(二)

    素帽褐衣过闹市 不攀蜗角求虚名 砚池斗室书天下 半纸清风一墨情 ——和吾师

  • 和之二

    云来我倚树听风,一卷无关色与空。 朝露掬得濯日月,暮烟不辨任西东。 琴心且寄草庐中,呼啸千山万里风。 一段青云拂罢...

  • 二和三

    二 第二天早上我起的很早,整理好我走上拱桥看一看这清晨的古镇,新鲜空气在鼻腔和胸腔间穿梭,春天的阳光温柔地落在水面...

  • 和 味觉(二)

    话说,昨晚发了有关味觉的话题,引起朋友议论:有人调侃,典型的新冠疫情;有人笑,跨了专业;有朋友今日下午推送了12份...

  • 不二和二姑娘

    我愚钝,硬是二十又好几年后才顿悟,人和另一个人,和某一个地方是被一根线牵着的,没有开窍时你丝毫感受不到,明白...

网友评论

      本文标题:(二)16.Proxy和Reflect19-08-13

      本文链接:https://www.haomeiwen.com/subject/qlfvjctx.html