ES6 Reflect

Reflect對(duì)象與Proxy對(duì)象一樣,也是 ES6 為了操作對(duì)象而提供的新 API。Reflect對(duì)象的設(shè)計(jì)目的有這樣幾個(gè)

(1) 將Object對(duì)象的一些明顯屬于語(yǔ)言?xún)?nèi)部的方法(比如Object.defineProperty),放到Reflect對(duì)象上?,F(xiàn)階段,某些方法同時(shí)在ObjectReflect對(duì)象上部署,未來(lái)的新方法將只部署在Reflect對(duì)象上。也就是說(shuō),從Reflect對(duì)象上可以拿到語(yǔ)言?xún)?nèi)部的方法。

(2) 修改某些Object方法的返回結(jié)果,讓其變得更合理。比如,Object.defineProperty(obj, name, desc)在無(wú)法定義屬性時(shí),會(huì)拋出一個(gè)錯(cuò)誤,而Reflect.defineProperty(obj, name, desc)則會(huì)返回false。

// 老寫(xiě)法
try {
  Object.defineProperty(target, property, attributes);
  // success
} catch (e) {
  // failure
}

// 新寫(xiě)法
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}

(3) 讓Object操作都變成函數(shù)行為。某些Object操作是命令式,比如name in objdelete obj[name],而Reflect.has(obj, name)Reflect.deleteProperty(obj, name)讓它們變成了函數(shù)行為。

// 老寫(xiě)法
'assign' in Object // true

// 新寫(xiě)法
Reflect.has(Object, 'assign') // true

(4)Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng),只要是Proxy對(duì)象的方法,就能在Reflect對(duì)象上找到對(duì)應(yīng)的方法。這就讓Proxy對(duì)象可以方便地調(diào)用對(duì)應(yīng)的Reflect方法,完成默認(rèn)行為,作為修改行為的基礎(chǔ)。也就是說(shuō),不管Proxy怎么修改默認(rèn)行為,你總可以在Reflect上獲取默認(rèn)行為。

Reflect對(duì)象一共有 13 個(gè)靜態(tài)方法

  • Reflect.apply(target, thisArg, args)
  • Reflect.construct(target, args)
  • Reflect.get(target, name, receiver)
  • Reflect.set(target, name, value, receiver)
  • Reflect.defineProperty(target, name, desc)
  • Reflect.deleteProperty(target, name)
  • Reflect.has(target, name)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)
  • Reflect.preventExtensions(target)
  • Reflect.getOwnPropertyDescriptor(target, name)
  • Reflect.getPrototypeOf(target)
  • Reflect.setPrototypeOf(target, prototype)

Reflect.has

Reflect.has方法對(duì)應(yīng)name in obj里面的in運(yùn)算符。

var myObject = {
  foo: 1,
};

// 舊寫(xiě)法
'foo' in myObject // true

// 新寫(xiě)法
Reflect.has(myObject, 'foo') // true

Reflect.deleteProperty

Reflect.deleteProperty方法等同于delete obj[name],用于刪除對(duì)象的屬性。

const myObj = { foo: 'bar' };

// 舊寫(xiě)法
delete myObj.foo;

// 新寫(xiě)法
Reflect.deleteProperty(myObj, 'foo');

該方法返回一個(gè)布爾值。如果刪除成功,或者被刪除的屬性不存在,返回true;刪除失敗,被刪除的屬性依然存在,返回false。

文章轉(zhuǎn)載自阮一峰的ES6入門(mén)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Object.defineProperty(obj, name, desc)在無(wú)法定義屬性時(shí),會(huì)拋出一個(gè)錯(cuò)誤,而R...
    恒星的背影閱讀 288評(píng)論 0 1
  • 本人自學(xué)es6已經(jīng)有一段時(shí)間了,只覺(jué)得有些時(shí)候很是枯燥無(wú)味, 時(shí)而又覺(jué)得在以后的職業(yè)生涯中會(huì)很有用,因?yàn)閑s6的很...
    可樂(lè)_37d3閱讀 1,659評(píng)論 0 0
  • defineProperty() 學(xué)習(xí)書(shū)籍《ECMAScript 6 入門(mén) 》 Proxy Proxy 用于修改某...
    Bui_vlee閱讀 706評(píng)論 0 1
  • 我種的小豆芽長(zhǎng)大了 今天有科學(xué)課,我把我種的小豆苗帶到學(xué)校。我看到同學(xué)們有的只用水泡,有的沒(méi)有用水泡,就直接種在土...
    陳泉妡閱讀 207評(píng)論 0 1
  • 雖然微軟HoloLens已經(jīng)正式面向開(kāi)發(fā)者發(fā)貨,然而這款售價(jià)3000美元的增強(qiáng)現(xiàn)實(shí)設(shè)備實(shí)際上則是獨(dú)立的微軟Win1...
    幻眼科技閱讀 484評(píng)論 0 1

友情鏈接更多精彩內(nèi)容