App下載

JavaScript 中 Reflect 的作用是什么?

貧困大賽形象代言人 2023-09-26 15:16:20 瀏覽數(shù) (2107)
反饋

 ES6 中 Reflect 的作用

微信截圖_20230926151549

  1. 將對(duì)象的一些明顯屬于語(yǔ)言內(nèi)部的方法放到Reflect對(duì)象上,改進(jìn)了Object對(duì)象的API設(shè)計(jì)。比如Object.defineProperty被移到了Reflect.defineProperty。
  2. 讓Object操作都變成函數(shù)行為。某些Object操作是命令式的,比如name in obj和delete obj[name],而Reflect對(duì)象上的方法都是函數(shù)行為,比如Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)。這讓Object操作都變得具備函數(shù)行為。
  3. 修改某些Object操作的返回結(jié)果,讓其變得更合理。比如Object.defineProperty在無(wú)法定義屬性時(shí)會(huì)拋出錯(cuò)誤,而Reflect.defineProperty會(huì)返回false。
  4. 讓Object操作都變成函數(shù)行為后,可以更改對(duì)象的行為,通過(guò)修改Reflect對(duì)象的方法來(lái)達(dá)到修改對(duì)象操作行為的目的。這就是用 Reflect 實(shí)現(xiàn)元編程(meta programming)的一種方式。
  5. 提供一種機(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》



0 人點(diǎn)贊