Reflect, Proxy的好基友!
Reflect
Reflect 对象简介
用Object的语法会做一些额外的事情,不直接。
而引入了Reflect就可以通过Reflect来直接调用对象的 内部方法
Reflect 是 ES6 (ECMAScript 2015) 中新增的一个内置对象,它提供了一些方法来处理对象属性的查询和操作。Reflect 对象的方法与 Object 对象的方法相似,但有一些关键的区别:
Reflect的方法不会改变this的指向,而Object方法会。Reflect的方法都是静态的,不能被继承或作为对象的方法调用。Reflect的方法在操作失败时不会抛出异常,而是返回false或undefined。
Reflect 的主要方法
receiver可以用来指定this
Reflect.get(target, propertyKey, receiver)- 获取对象 
target上的属性propertyKey的值。 - 如果属性不存在或不可访问,返回 
undefined。 
- 获取对象 
 Reflect.set(target, propertyKey, value, receiver)- 设置对象 
target上的属性propertyKey的值为value。 - 如果操作失败(如属性是不可写的),返回 
false。 
- 设置对象 
 Reflect.has(target, propertyKey)- 检查对象 
target是否有属性propertyKey。 - 返回 
true或false。 
- 检查对象 
 Reflect.deleteProperty(target, propertyKey)- 删除对象 
target上的属性propertyKey。 - 如果删除成功,返回 
true;如果属性是不可配置的,则返回false。 
- 删除对象 
 Reflect.ownKeys(target)- 返回对象 
target的所有自有属性的键名,包括 Symbol 类型的键名。 
- 返回对象 
 Reflect.getOwnPropertyDescriptor(target, propertyKey)- 返回对象 
target上属性propertyKey的描述符。 - 如果属性不存在,返回 
undefined。 
- 返回对象 
 Reflect.defineProperty(target, propertyKey, attributes)- 定义或修改对象 
target上属性propertyKey的描述符。 - 如果操作失败(如属性是不可配置的),抛出异常。
 
- 定义或修改对象 
 Reflect.preventExtensions(target)- 阻止对象 
target被扩展。 - 如果对象已经被阻止扩展,返回 
true;否则返回false。 
- 阻止对象 
 Reflect.isExtensible(target)- 检查对象 
target是否可以被扩展。 - 返回 
true或false。 
- 检查对象 
 Reflect.getOwnPropertyDescriptors(target)- 返回对象 
target的所有自有属性的描述符。 
- 返回对象 
 Reflect.apply(target, thisArgument, argumentsList)- 调用 
target函数,将this绑定到thisArgument上,并传入argumentsList作为参数数组。 
- 调用 
 Reflect.construct(target, argumentsList, newTarget)- 使用 
target构造函数创建一个新对象,传入argumentsList作为参数数组。 - 如果提供了 
newTarget,则使用newTarget作为构造函数的原型。 
- 使用 
 
示例
1  | const obj = { x: 1, y: 2 };  | 
Proxy和Reflect的配合使用
为什么Proxy一定要配合Reflect使用?恰恰是为了触发代理对象的劫持时保证正确的 this 上下文指向。
针对于 get 陷阱(当然 set 其他之类涉及到 receiver 的陷阱同理):
- Proxy 中接受的 Receiver 形参表示 代理对象本身或者继承与代理对象的对象 。
 - Reflect 中传递的 Receiver 实参表示 修改执行原始操作时的 this 指向。
 
1  | const obj = {  | 












