App下載

JavaScript 中 Reflect 的作用是什么?

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

 ES6 中 Reflect 的作用

微信截圖_20230926151549

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



0 人點(diǎn)贊