Skip to content

Reflect

统一命名空间

Reflect 出现之前,JavaScript 已经存在对象反射机制相关的 API,但是这些 API 没有组织在一个命名空间下。 从 ES6 开始,这些 API 都存在于 Reflect 命名空间下。

使用更加简单

Object 内置的方法失败时会抛出一个异常交由开发者处理,而 Reflect 提供的方法返回的是一个 boolean 类型的值。

Example1: Object.defineProperty() 方法

javascript
try {
  Object.defineProperty(obj, name, desc);
  // 属性定义成功
} catch (e) {
  // 属性定义失败,需要在这里进行异常处理
}

Example2: Reflect.defineProperty() 方法

javascript
if (Reflect.defineProperty(obj, name, desc)) {
  // 属性定义成功
} else {
  // 属性定义失败
}

函数化风格

  • 使用 new 调用构造函数,new Function(...args) -> Reflect.constructor(Function, args, Function)
  • 检查属性是否存在于对象,property in object -> Reflect.has(object, property)
  • 属性访问符,object[key] -> Reflect.get(object, key)