设计目的
包含一些静态方法。设计这个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修改属性时,触发callback
observe(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;
}
}
} // 太拉了