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