Reflect 与 Proxy 一样,是 ES6 为了操作对象引入的 API。Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
设计目的:
1、将 Object 下面的一些方法转移到了 Reflect 上
ES5 中的 Object.defineProperty()
在 ES6中可以通过 Reflect.defineProperty()
使用。
ES 在设计之初,有很多方法被放在了 Object 对象下面,这样并不是非常合理,未来也还会有方法被转移到 Reflect 上。这也是 ES 不断升级的原因之一,语法会越来越规范。现在一些方法在 Object 和 Reflect 下并存,但是未来可能会将这些方法从 Object 对象下移除。
2、修改某些 Object 方法的返回结果,让其变得更合理
Object.defineProperty()
方法定义属性时,如果当前属性无法被定义的话会抛出异常,在 ES5 中我们需要使用 try catch 来接收可能抛出的异常,因为 Object.defineProperty()
方法并没有返回值。而新方法Reflect.defineProperty()
会返回布尔值,如果当前可以定义这个属性返回 true,否则返回 false。这样的方法更加合理。
1 | try { |
3、让 Object 命令操作变成函数行为
在之前的语法中,很多 Object 的操作都是命令式的,而在 ES6 中一些命令操作被改成了函数行为。例如 ES5 中使用in
操作符判断某个属性或方法是否存在于给定对象中,而 ES6 中可以使用 Reflect.has()
方法进行判断。
1 | console.log('assign' in Object) // true |
Reflect 对象的方法与 Proxy 对象的方法一一对应:
只要是 Proxy 对象上的方法,就能在 Reflect 对象上找到对应的方法。
1 | let user = { |