美文网首页
ES6中新增的Reflect怎么用?

ES6中新增的Reflect怎么用?

作者: 易路先登 | 来源:发表于2019-06-20 00:06 被阅读0次

Reflect是ES6提供的新对象,它的作用有二:

  1. 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty,Proxy对象上所有新增函等),放到Reflect对象上。

  2. 让Object操作都变成函数行为,将对象的操作符操作封装为函数以让用户明显感知操作的成败。修改某些Object方法的返回结果,让其变得更合理。
    如:

let obj = {
  name:'zhangsan'
}
obj.name = 'lisi';
console.log(obj)//{name:'lisi'}

这是一个普通的不能再普通的对象属性赋值操作,设置成功后obj对象的name属性值变为'lisi'。然而某些情况下操作失败时,要么是不友好的报错,要么用户并无感知,导致找不到bug出处。
如程序员甲给obj的name属性设置了不可写:

let obj = {
  name:'zhangsan'
}
Object.defineProperty(obj,'name',{
    writable:false
})
obj.name = 'lisi';
console.log(obj)//{name:'张三'}

程序员乙通过obj.name = 'lisi'设置了name属性的值,然而name属性的值未改变,莫名其妙。如果通过Reflect提供的api代替.操作符进行的属性访问和设置操作,就可明显感知操作的成败,然后再编写后续的逻辑。

let obj = {
  name:'zhangsan'
}
Object.defineProperty(obj,'name',{
    writable:false
})
obj.name = 'lisi';
var  result = Reflect.set(obj,'name','lisi');
if(result ){
  console.log(obj)//当属性可写的情况下成功更改属性的值
}else{
  console.log('name属性值修改失败,请检查是否设置了不可写,或其他原因')
}

根据以上理论,可将Proxy代理改写的更合理:

let objs = {
  name:'zhangsan',
  password:'123456'
}
Object.defineProperty(objs,'name',{
    writable:false
});
let proxy=new Proxy(objs,{
  set(target,key,value){
    let isSuccess=Reflect.set(target,key,value);
    if(!isSuccess){
      throw new Error('值设置失败');
    }
    return isSuccess
  }
})
proxy.name = 18;
console.log(objs);
//Uncaught Error: 值设置失败

这样用户就可以明显感知静默操作的成败。
剩下的Reflect对象上的函数和Proxy对象上的函数名字,参数一致,感兴趣的可查看
ES6中Proxy的详细用法
Reflect实用小栗子
ES6总篇--目录

相关文章

  • ES6中新增的Reflect怎么用?

    Reflect是ES6提供的新对象,它的作用有二: 将Object对象的一些明显属于语言内部的方法(比如Objec...

  • 使用Reflect和Proxy编写的值校验。

    可以使用Reflect和Proxy编写脱离值本身的校验,便于维护与重构。代码如下: ES6中新增的Reflect怎...

  • ECMAScript6--let、const

    在es6之前用var定义变量。es6中新增了let、const 变量声明提升 所谓变量声明提升指的是,用var定义...

  • ES6中新增的Proxy怎么用?

    Proxy 代理。 1 什么是代理? 可通过new Proxy(obj,{})创建一个obj对象的代理对象,代码如...

  • ES6标准入门读书笔记12(Reflect)未完待续

    概述 § ⇧ Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect...

  • Reflect

    概述 § ⇧ Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect...

  • Reflect 对象

    Reflect 对象与 Proxy 对象一样,也是 ES6 为了操作对象而提供的新的API。Reflect 对象的...

  • ES6——Reflect 与 Proxy

    ES6 之 Proxy 介绍深入实践 ES6 Proxy & Reflect 1.Proxy Proxy 可以对目...

  • ts + reflect 编程, 实现 类 spring bo

    es6 提供了 reflect api, es7 的 提供有装饰器。 我们可以尝试用装饰器 + reflect 实...

  • ES6 Reflect

    一、概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect对象...

网友评论

      本文标题:ES6中新增的Reflect怎么用?

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