概述
Reflect
是为了操作对象而提供的 API
,它的设计目的有以下几个。
- 将
Object
上一些属于语言内部的方法 (比如Object.defineProperty
)放在Reflect
对象上。现阶段,某些方法同时在Object
和Relfect
对象上部署,未来的新方法将只部署在Reflect
对象上。 - 修改某些
Object
方法的返回结果,让其更加完善。比如,Object.defineProperty(obj,name,desc)
在无法定义属性时,会抛出一个异常,而Reflect.defineProperty(obj,name,desc)
则会返回false
- 让
Object
操作变成函数行为。某些Object
操作是命令式的,比如name in obj
和delete obj[name]
,而Reflect.has(obj,name)
和Reflect.deleteProperty(obj,name)
让他们变成了函数行为。 Reflect
对象的方法与Proxy
对象的方法对应,只要是Proxy
对象的方法,就能在Reflect
对象上找到对应的方法。这就让Proxy
对象可以方便的调用对应的方法,完成默认行为。也就是说,不管Proxy
怎么修改默认行为,你总可以在Reflect
上获取默认行为。
静态方法
Reflect
对象上一共有13个静态方法,这些大部分与 Object
对象同名甚至作用都是相同的,而且它与 Proxy
对象的方法是对应的。
Reflect.get(target,name,receiver)
Reflect.get()
方法查找并返回 target
对象的 name
属性,如果没有该属性,则返回 undefined
。如果 name
属性部署了 getter
,那么将 receiver
绑定到函数中的 this
。
let person = {
name:"jonas",
get age(){
return this.age
}
}
let jonas = {
ag