JS-Reflect
1. 什么是 Reflect
ES6
标准引入的一个全局对象,提供了一系列用于操作对象的方法。- 这些方法可以便捷地实现对于
JS
的内部操作
[!ai] >
Reflect
的主要目标是:
- 整合:JavaScript 语言中的内部操作变得更为一致。例如,之前
Object.defineProperty()
在失败时抛出异常,而赋值操作则返回false
。使用Reflect.defineProperty()
和Reflect.set()
,这两种操作在失败时都会返回false
。- 扩展能力:某些方法(如
Reflect.apply()
和Reflect.construct()
)提供了对旧有功能的更为灵活的调用方式。- 更好的代理支持:
Reflect
和Proxy API
配合得很好,让创建代理对象变得更简单、更一致。
2. Reflect
的应用场景
2.1 利用 Reflect
判断对象为空
- 利用
Reflect
判断对象是否为空是最佳方式
js
function isEmpty(obj) {
return Reflect.ownKeys(obj).length === 0
}
console.log(isEmpty({})) // true
console.log(isEmpty({ a: 1 })) // false
Object.keys(obj)
返回对象所有可枚举的自有属性。如果有非枚举属性或者符号属性,那么将不会被考虑。Object.getOwnPropertyNames(obj)
返回对象的所有自有属性,无论是否可枚举。但是并不考虑符号属性。Reflect.ownKeys(obj)
: 返回对象的所有自有属性,包括不可枚举属性和符号属性。
2.2 和 Proxy
配合
Proxy
允许开发者创建一个“代理”对象,从而拦截自定义对象的基本操作(比如属性读取,属性设置,函数调用等等)。- 这些基本操作,
Proxy
和Reflect
设计成一一对应的,Proxy
负责拦截,Reflect
可以在拦截之后,将Reflect
的方法当作默认行为,从而保证一致性。