ES6 中 Reflect 的作用
- 將對(duì)象的一些明顯屬于語(yǔ)言內(nèi)部的方法放到Reflect對(duì)象上,改進(jìn)了Object對(duì)象的API設(shè)計(jì)。比如Object.defineProperty被移到了Reflect.defineProperty。
- 讓Object操作都變成函數(shù)行為。某些Object操作是命令式的,比如name in obj和delete obj[name],而Reflect對(duì)象上的方法都是函數(shù)行為,比如Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)。這讓Object操作都變得具備函數(shù)行為。
- 修改某些Object操作的返回結(jié)果,讓其變得更合理。比如Object.defineProperty在無(wú)法定義屬性時(shí)會(huì)拋出錯(cuò)誤,而Reflect.defineProperty會(huì)返回false。
- 讓Object操作都變成函數(shù)行為后,可以更改對(duì)象的行為,通過(guò)修改Reflect對(duì)象的方法來(lái)達(dá)到修改對(duì)象操作行為的目的。這就是用 Reflect 實(shí)現(xiàn)元編程(meta programming)的一種方式。
- 提供一種機(jī)制來(lái)判斷默認(rèn)操作是否成功。某些默認(rèn)操作的返回值含義不清晰,例如 in 運(yùn)算符的返回值只有 true/false 兩種,不夠清晰。Reflect對(duì)象的方法在失敗時(shí)會(huì)拋出異常,這比一個(gè)簡(jiǎn)單的 true/false 要清晰的多。
例如:
1. 將Object操作變成函數(shù)行為
// 非函數(shù)行為的寫(xiě)法
'foo' in myObject
// 函數(shù)行為寫(xiě)法
Reflect.has(myObject, 'foo')
2. 修改返回值變得更合理
// Object.defineProperty會(huì)拋出錯(cuò)誤
Object.defineProperty(myObject, 'foo', {value: 1})
// Reflect.defineProperty會(huì)返回bool值
Reflect.defineProperty(myObject, 'foo', {value: 1})
3. 用函數(shù)行為改變默認(rèn)行為
// 默認(rèn)行為
delete myObject.foo;
// 改變默認(rèn)行為
Reflect.deleteProperty(myObject, 'foo')
4. 判斷默認(rèn)操作是否成功
// 默認(rèn)操作返回bool值
'foo' in myObject
// Reflect會(huì)拋出錯(cuò)誤
Reflect.has(myObject, 'foo')
如果你想了解更多關(guān)于Reflect反射的知識(shí),這里有最通俗易懂的教程《ES6 Reflect》。