Skip to content

JS-Reflect

1. 什么是 Reflect

  • ES6 标准引入的一个全局对象,提供了一系列用于操作对象的方法。
  • 这些方法可以便捷地实现对于 JS内部操作

[!ai] >Reflect 的主要目标是:

  1. 整合:JavaScript 语言中的内部操作变得更为一致。例如,之前 Object.defineProperty() 在失败时抛出异常,而赋值操作则返回 false。使用 Reflect.defineProperty()Reflect.set(),这两种操作在失败时都会返回 false
  2. 扩展能力:某些方法(如 Reflect.apply()Reflect.construct())提供了对旧有功能的更为灵活的调用方式。
  3. 更好的代理支持ReflectProxy 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 允许开发者创建一个“代理”对象,从而拦截自定义对象的基本操作(比如属性读取,属性设置,函数调用等等)。
  • 这些基本操作ProxyReflect 设计成一一对应的,Proxy 负责拦截, Reflect 可以在拦截之后,将 Reflect 的方法当作默认行为,从而保证一致性。

2.3