前言
Reflect 对象设计的目的:
- 1、将 Object 对象的一些明显属性语言内部的方法,放到 Reflect 对象上
- 2、修改某些 Object 方法的返回结果,让其变得合理。如 Object.defineProperty(obj, name, desc)在无法定义属性时会抛出一个错误。而 Reflect.defineProperty(obj, name, desc)则返回false
- 3、让 Object 操作都变成函数行为。如 'name' in obj、delete obj[name] ,而Reflect.has(Object, 'name')、Reflect.deleteProperty(obj, 'name')
- 4、Reflect 与 Proxy方法一一对应。这就是Proxy对象可以方便的调用对应的Reflect方法来完成默认行为,作为修改行为的基础,确保完成原有对象的行为
静态方法
与Proxy一致。
实例
//观察者模式
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {
set(target, key, value, receiver){
const result = Reflect.set(target, key , value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
});
var obj = {name: 'lili', age: 25};
observe(() => console.log(` 有变动`));
observe(() => console.log(` 有变动2`));
var proxy = observable(obj);
proxy.name = 'xixi';