Reflect

1. Reflect是什么?

Reflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新API。Reflect对象的设计目的有这样几个:
(1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现在某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect上。也就是说,从Reflect对象上可以拿到语言内部的方法。
(2)让某些Object方法的返回结果更合理。比如,Object.defineProperty在无法定义属性时,会抛出一个错误。而Reflect.defineProperty则会返回false。(但是,Reflect大部分静态方法都会因为参数不是object对象而报错。)
(3)让Object操作都变成函数行为。比如:name in obj和delete obj[name]都是命令式, Reflect.has(obj, name)和Reflect.deleteProperty让它们变成了函数行为。
(4)Reflect对象与Proxy对象方法一一对应。可以作用Proxy修改默认行为的基础。
(5)很多方法更易读:
// 老写法 Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新写法 Reflect.apply(Math.floor, undefined, [1.75]) // 1

2. 静态方法

Reflect一共13个常用静态方法。

  Reflect.get(target, name, receiver)
  Reflect.set(target, name, value, receiver)
  Reflect.has(target, name)
  Reflect.deleteProperty(target, name)
  Reflect.getPrototypeOf(target)
  Reflect.setPrototypeOf(target, prototype)
  Reflect.construct(target, args)
  Reflect.apply(target, thisArg, args)
  Reflect.defineProperty(target, name, desc) 
  Reflect.getOwnPropertyDescriptor(target, name)
  Reflect.isExtensible(target)
  Reflect.preventExtensions(target)
  Reflect.ownKeys(target)

大部分方法的作用,与Object对象的同名方法作用相同,而且与Proxy对象的方法一一对应。

你可能感兴趣的:(Reflect)