昨天,我作了 es6 中的新对象 Proxy 的相关的知识整理,如今会整理一下 es6 中另一个新的内置对象:Reflect。javascript
Reflect 是一个在元编程中使用大量静态方法的全局对象。java
跟着我一块儿来了解一下吧。es6
Reflect.get() 和 Reflect.set() 能够操做一个对象的属性。编程
const Jing = { sex: 'female', age: '22' }; console.log(Reflect.get(Jing, 'sex'));// 'female' console.log(Reflect.set(Jing, 'age','21')); console.log(Reflect.get(Jing,'age'))// '21'
Reflect 还提供还提供了一种不使用 new,而是用 Refelct.construct 来调用构造函数的方法。如函数
function Employee(name) { this.name = name; } const huang = new Employee('yuanyuan'); console.log(huang.name)// yuanyuan const zhang = Reflect.construct(Employee, ['zhenzhen']); console.log(zhang.name);// zhenzhen
由上述例子可见,new target () 和 Reflcet.construct(target) 是等同的。this
除此以外 Reflect 的方法和一些静态对象的方法是同样的,也就是说,从 Reflect 对象上能够拿到语言内部的方法,好比 getPrototypeOf:代理
function Employee(name) { this.name = name; } const huang = new Employee('yuanzhen'); console.log(Object.getPrototypeOf(huang));// Employee console.log(Reflect.getPrototypeof(huang));// Employee
可知, Reflect.getPrototypeof() 和 Object.getPrototypeOf() 同样均可以获取对象的原型对象。code
好比 defineProperty; es6 中的 Reflect.defineProperty 和 Object.defineProperty 基本等同,用来为对象定义属性:server
function myDate() { return false; } Object.defineProperty(myDate,'now',{ value: () => Date.now() }; Refelct.defineProperty(myDate,'now', { value: () => Date.now() }); console.log(Reflect.get(myDate, 'now'));
可是他们之间有一点区别:Object.defineProperty(obj,name,desc) 在没法定义属性时,会抛出一个错误,而 Reflect.defineProperty(obj,name,desc) 则会返回 false;对象
const queueObservers = new Set(); const observe = fn => queueObservers.add(fn); const observable = obj => new Proxy(obj,{set}); function set(target,key,value,receiver) { const result = Reflect.set(target,key,value,receiver) queueObservers.forEach(observer => observer()); return result; }
思路是 observable 函数返回一个原始对象的 Proxy 代理,拦截赋值操做,触发充当观察者的各个函数。
上面代码中,定义了一个 Set 集合,全部观察者函数都放进这个集合,而后,observable 函数返回原始对象的代理,拦截赋值操做。拦截函数 set 之中,会自动执行全部观察者。