设计目的
包含一些静态方法。设计这个API的目的:
- 将
Object中一些明显属于语言内部的方法(例如:Object.defineProperty),放到Reflect对象上 - 修改一些方法的返回值的返回值让其更合理。例如当使用
Object.defineProperty给对象添加属性时,如果不能添加,会抛出一个错误,但是Reflect.defineProperty会返回false - 将对Object的操作都变成函数行为。如
in、delete变为Reflect.has和Reflect.deleteProperty Reflect对象中的方法与Proxy handler中的方法一一对应,代表基础行为。例如:
const obj = new Proxy({}, {get(target, key, reciver) {console.log('拦截成功');return Reflect.get(target, key, reciver)// 默认对target的取值行为}})
方法
Reflect对象一共有 13 个静态方法。Reflect.apply(target, thisArg, args)。相当于
Function.prototype.apply.call(target, thisArg, args)- Reflect.construct(target, args)
- Reflect.get(target, name, receiver)
- Reflect.set(target, name, value, receiver)
- Reflect.defineProperty(target, name, desc)
- Reflect.deleteProperty(target, name)
- Reflect.has(target, name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)。与
Object.isExtensible对应,表示该对象是否可扩展(添加属性) - Reflect.preventExtensions(target)。与
Object.preventExtensions对应,让对象变为不可扩展。 - Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)
上面这些方法的作用,大部分与Object对象的同名方法的作用都是相同的,而且它与Proxy对象的方法是一一对应的。
应用场景
利用Proxy和Reflect实现一个观察者模式。
class Observer{constructor(callback) {this.callback = callback;this.revokeList = [];}// 对target进行代理,当target修改属性时,触发callbackobserve(target) {let _that = this; // 保存ob实例if (target) {let p = Proxy.revocable(target, {set(target, key, val, receiver) {_that.callback(); // 调用回调return Reflect.set(target, key, val, receiver);}})this.revokeList.push(p.revoke);return p.proxy;}}revoke () {if (this.revokeList.length) {this.revokeList.forEach(item => {item();});return true; // return a true flag to make success} else {return false;}}} // 太拉了
