ES6 中 Reflect 的作用

  1. 将对象的一些明显属于语言内部的方法放到Reflect对象上,改进了Object对象的API设计。比如Object.defineProperty被移到了Reflect.defineProperty。
  2. 让Object操作都变成函数行为。某些Object操作是命令式的,比如name in obj和delete obj[name],而Reflect对象上的方法都是函数行为,比如Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)。这让Object操作都变得具备函数行为。
  3. 修改某些Object操作的返回结果,让其变得更合理。比如Object.defineProperty在无法定义属性时会抛出错误,而Reflect.defineProperty会返回false。
  4. 让Object操作都变成函数行为后,可以更改对象的行为,通过修改Reflect对象的方法来达到修改对象操作行为的目的。这就是用 Reflect 实现元编程(meta programming)的一种方式。
  5. 提供一种机制来判断默认操作是否成功。某些默认操作的返回值含义不清晰,例如 in 运算符的返回值只有 true/false 两种,不够清晰。Reflect对象的方法在失败时会抛出异常,这比一个简单的 true/false 要清晰的多。

例如:

1. 将Object操作变成函数行为

// 非函数行为的写法
'foo' in myObject 

// 函数行为写法 
Reflect.has(myObject, 'foo')

2. 修改返回值变得更合理

// Object.defineProperty会抛出错误
Object.defineProperty(myObject, 'foo', {value: 1}) 

// Reflect.defineProperty会返回bool值
Reflect.defineProperty(myObject, 'foo', {value: 1})

3. 用函数行为改变默认行为

// 默认行为
delete myObject.foo;

// 改变默认行为
Reflect.deleteProperty(myObject, 'foo')

4. 判断默认操作是否成功

// 默认操作返回bool值
'foo' in myObject

// Reflect会抛出错误
Reflect.has(myObject, 'foo')

如果你想了解更多关于Reflect反射的知识,这里有最通俗易懂的教程《ES6 Reflect》

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。