ES6引入的Reflect对象目的何在?

Reflect对象其实就是为了取代Object对象。取代原因有一下几点:

1)Object对象的一些内部方法放在了Reflect上面,比如:Object.defineProperty。主要是优化了语言内部的方法。

2)修改Object方法的返回,例如:Object.definePropery(obj,name,desc)无法定义属性时报错,而Reflect.definedProperty(obj,name,desc)则会返回false。

3)让Object变成函数的行为,以前的:name in obj和delete obj[name],可以让Reflect.has(name)和Reflect.deleteProperty(obj,name)替代。

4)Reflect方法和Proxy方法一一对应。主要就是为了实现本体和代理的接口一致性,方便用户通过代理操作本体。

ES6提供了Proxy代理对象,不需要开发者自己再去写代理对象的方法,这点很方便,一些代理需求就可以使用Proxy完成,本体的操作可以通过Reflect对象调用。

//定义一个订阅者集合
const queuedObservers = new Set();
//添加订阅者
const observe = fn => queuedObservers.add(fn);
//给对象添加代理对象,代理的set方法中进行遍历订阅者列表
const observable = obj => new Proxy(obj,{set});

function set(target,key,value,receiver){
        const result = Reflect.set(target,key,value,receiver);
        //遍历订阅者集合,依次触发订阅者方法
        queuedObservers.forEach(fn => fn());
        //返回订阅者
        return result;
}

//使用Proxy实现观察者模式[发布-订阅者模式]
const person = observable({name:'张三',age:30});

function print(){
    console.log(`${person.name},${person.age}`);
}
function anotherPrint(){
    console.log(`你想的很对`)
}

//订阅者集合里面加入print订阅者
observe(print);
observe(anotherPrint)

person.name = 'miya'

这里实现了一个观察者模式,主要的触发点在对象的set调用后,在代理对象person里面进行观察者方法的触发。

 

【完】

如果不想动辄就暴露智商 
要么多读书要么少说话

posted @ 2018-11-12 14:11  tangjiao_Miya  阅读(955)  评论(0编辑  收藏  举报