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 = { |