### 概述
`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)