es6之Reflect

131 阅读1分钟

前言

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';