Reflect 对象的使用

Reflect 提供统一的对象操作方法,整合了 Object 的相关功能

问题

Reflect 是什么?如何使用?

解答

Reflect 是 ES6 引入的内置对象,用于对对象进行统一操作,集成了 Object 相关的所有方法,提供更规范的 API。

主要方法

Reflect.apply():类似 Function.prototype.apply,调用函数并传入参数。

Reflect.construct():对构造函数进行 new 操作,相当于 new target(...args)

Reflect.defineProperty():定义对象属性,类似 Object.defineProperty()

Reflect.deleteProperty():删除对象属性,相当于 delete target[name]

Reflect.get():获取对象属性值,类似 target[name]

Reflect.getOwnPropertyDescriptor():获取属性描述符,类似 Object.getOwnPropertyDescriptor()

Reflect.getPrototypeOf():获取对象原型,类似 Object.getPrototypeOf()

Reflect.has():判断对象是否存在某个属性,功能同 in 运算符。

Reflect.isExtensible():判断对象是否可扩展。注意:Object.seal()Object.freeze() 后的对象不可扩展。

Reflect.ownKeys():返回所有自身属性的数组(不包含继承属性),不受 enumerable 影响。

Reflect.preventExtensions():阻止对象扩展,返回 Boolean。

Reflect.set():设置属性值,返回 Boolean 表示是否成功。

Reflect.setPrototypeOf():设置对象原型,类似 Object.setPrototypeOf()

示例

const obj = {
  name: 'reflect',
}

Reflect.preventExtensions(obj) // 禁止扩展
console.log(Reflect.set(obj, 'age', 'xiaobai')) // false
console.log(obj) // { name: 'reflect' }
console.log(Reflect.isExtensible(obj)) // false
console.log(Reflect.ownKeys(obj)) // [ 'name' ]

关键点

  • Reflect 提供统一的对象操作 API,比 Object 方法更规范
  • Reflect.set() 返回 Boolean,可以明确知道操作是否成功
  • Reflect.ownKeys() 不受 enumerable 影响,返回所有自身属性
  • 配合 Proxy 使用时,Reflect 方法可以保证正确的 this 指向