十、ES6系列之Reflect

Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handlers 的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。

Reflect 的所有属性和方法都是静态的(就像 Math 对象)。
Reflect 对象提供了以下静态方法,这些方法与 proxy handler methods 的命名相同。

  • Reflect.apply(target, thisArg, args)
    对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。
  • Reflect.construct(target, args)
    对构造函数进行 new 操作,相当于执行 new target(…args)。
  • Reflect.get(target, name, receiver)
    获取对象身上某个属性的值,类似于 target[name]。
  • Reflect.set(target, name, value, receiver)
    将值分配给属性的函数。返回一个 Boolean,如果更新成功,则返回 true。
  • Reflect.defineProperty(target, name, desc)
    和 Object.defineProperty() 类似。如果设置成功就会返回 true
  • Reflect.deleteProperty(target, name)
    作为函数的 delete 操作符,相当于执行 delete target[name]。
  • Reflect.has(target, name)
    判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
  • Reflect.ownKeys(target)
    返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受 enumerable 影响).
  • Reflect.isExtensible(target)
    类似于 Object.isExtensible().
  • Reflect.preventExtensions(target)
    类似于 Object.preventExtensions()。返回一个 Boolean。
  • Reflect.getOwnPropertyDescriptor(target, name)
    类似于 Object.getOwnPropertyDescriptor()。如果对象中存在该属性,则返回对应的属性描述符, 否则返回 undefined.
  • Reflect.getPrototypeOf(target)
    类似于 Object.getPrototypeOf()。
  • Reflect.setPrototypeOf(target, prototype)
    设置对象原型的函数. 返回一个 Boolean, 如果更新成功,则返回 true。

由于 Reflect 对象的方法与 Proxy 对象的方法一一对应,只要是 Proxy 对象的方法,就能在 Reflect 对象上找到对应的方法。所以具体的方法使用这里不做过多描述。

参考文献