### 概述
`Reflect`對象與`Proxy`對象一樣,也是ES6為了操作對象而提供的新的API。它的設計目標如下:
- 將`Object`對象的一些明顯屬于語言內部的方法(比如:Object.defineProperty),放到`Reflect`對象上。
- 修改某些`Object`方法的返回結果,使其變的更加合理。
- 讓`Object`操作都變成函數行為。
- `Reflect`對象的方法與`Proxy`對象 的方法一一對應,只要是`Proxy`對象的方法,就能在`Reflect`對象上找到對應的方法。
### 靜態方法
`Reflect`對象一共有13個靜態方法:
#### Reflect.get(target, name, receiver)
`Reflect.get`方法查找并返回`target`對象的`name`屬性,如果沒有找到則返回`undefined`
```js
let myObject = {
foo: 1,
bar: 2,
get baz () {
return this.foo + this.bar
}
}
Reflect.get(myObject, 'foo') // 1
Reflect.get(myObject, 'bar') // 2
Reflect.get(myObject, 'baz') // 3
```
#### Reflect.set(target, name, value, receiver)
`Reflect.set`方法設置`target`對象的`name`屬性為`value`
```js
let myObject = {
foo: 1,
set bar (value) {
return this.foo = value
}
}
myObject.foo // 1
Reflect.set(myObject, 'foo', 2)
myObject.foo // 2
Reflect.set(myObject, 'bar', 3)
myObjedct.foo // 3
```
#### Reflect.has(obj, name)
`Reflect.has`方法對應`in`操作
#### Reflect.deleteProperty(obj, name)
`Reflect.deleteProperty`方法等同于`delete obj[name]`,用于刪除對象的屬性
#### Reflect.construct(target, args)
`Reflect.construct`方法等同于`new target(...args)`,提供了一種不適用`new`來調用構造函數的方法。
#### Reflect.getPrototypeOf(obj)
`Reflect.getPrototpyeOf`方法用于讀取對象的`__proto__`屬性,對應`Object.getPrototypeOf(obj)`
#### Reflect.setPrototypeOf(obj, newProto)
#### Reflect.apply(func, thisArg, args)
#### Reflect.defineProperty(target, propertyKey, attributes)
#### Reflect.getOwnPropertyDescriptor(target.propertyKey)
#### Reflect.isExtensible(target)
#### Reflect.preventExtentsions(target)