Reflect
对象与Proxy对象一样也是ES6为了操作对象而提供的心API。
Reflect对象设计目的:
1. 将Object
对象的一些明显属于语言层面的方法放到Reflect
对象上。
现阶段,一些方法在
Object
和Reflect
对象上同时部署,未来的新方法将只部署在Reflect
上。
2. 修改某些Object
方法的返回结果,让其变得更合理。
比如
Object.difineProperty(target,propertyKey,attr)
在无法定义属性时会抛出一个错误,
而Reflect.difineProperty(target,propertyKey,attr)
返回false
3. 让Object
的操作都变成函数行为。
某些
Object
操作是命令式,比如name in obj
和delete
,而Reflect.has(obj,name)
和Reflect.deleteProperty(obj,name)
让它们变成函数行为。
4. Reflect
对象方法与Proxy对象方法一一对应,只是要是Proxy对象方法,就能在Reflect
对象上找到对应的方法。让Proxy对象可以方便的调用对应的Reflect
方法完成默认行为,作为修改行为的基础。
不管Proxy如何修改默认行为,总能在
Reflect
上获取默认行为。
Proxy(target,{
set:function(target,name,value,receiver){
var success = Reflect.set(target,name,value,receiver);
if(success){
log('property'+name+'on'+target+'set to ' + value)
}
return success;
}
})
上面代码中,Proxy方法拦截了target
对象的属性赋值行为。采用Reflect.set
方法赋值给对象的属性,然后在部署额外的功能。
网友评论