Reflect是ES6提供的新對象,它的作用有二:
將Object對象的一些明顯屬于語言內(nèi)部的方法(比如Object.defineProperty,Proxy對象上所有新增函等),放到Reflect對象上。
讓Object操作都變成函數(shù)行為,將對象的操作符操作封裝為函數(shù)以讓用戶明顯感知操作的成敗。修改某些Object方法的返回結(jié)果,讓其變得更合理。
如:
let obj = {
name:'zhangsan'
}
obj.name = 'lisi';
console.log(obj)//{name:'lisi'}
這是一個普通的不能再普通的對象屬性賦值操作,設(shè)置成功后obj對象的name屬性值變?yōu)?lisi'。然而某些情況下操作失敗時,要么是不友好的報錯,要么用戶并無感知,導(dǎo)致找不到bug出處。
如程序員甲給obj的name屬性設(shè)置了不可寫:
let obj = {
name:'zhangsan'
}
Object.defineProperty(obj,'name',{
writable:false
})
obj.name = 'lisi';
console.log(obj)//{name:'張三'}
程序員乙通過obj.name = 'lisi'設(shè)置了name屬性的值,然而name屬性的值未改變,莫名其妙。如果通過Reflect提供的api代替.操作符進(jìn)行的屬性訪問和設(shè)置操作,就可明顯感知操作的成敗,然后再編寫后續(xù)的邏輯。
let obj = {
name:'zhangsan'
}
Object.defineProperty(obj,'name',{
writable:false
})
obj.name = 'lisi';
var result = Reflect.set(obj,'name','lisi');
if(result ){
console.log(obj)//當(dāng)屬性可寫的情況下成功更改屬性的值
}else{
console.log('name屬性值修改失敗,請檢查是否設(shè)置了不可寫,或其他原因')
}
根據(jù)以上理論,可將Proxy代理改寫的更合理:
let objs = {
name:'zhangsan',
password:'123456'
}
Object.defineProperty(objs,'name',{
writable:false
});
let proxy=new Proxy(objs,{
set(target,key,value){
let isSuccess=Reflect.set(target,key,value);
if(!isSuccess){
throw new Error('值設(shè)置失敗');
}
return isSuccess
}
})
proxy.name = 18;
console.log(objs);
//Uncaught Error: 值設(shè)置失敗
這樣用戶就可以明顯感知靜默操作的成敗。
剩下的Reflect對象上的函數(shù)和Proxy對象上的函數(shù)名字,參數(shù)一致,感興趣的可查看
ES6中Proxy的詳細(xì)用法
Reflect實(shí)用小栗子
ES6總篇--目錄