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里面进行观察者方法的触发。
【完】
如果不想动辄就暴露智商
要么多读书要么少说话