本篇文章給大家?guī)砹岁P(guān)于JavaScript中Proxy與Reflect的相關(guān)知識(shí),希望對(duì)大家有幫助。
ECMAScript 在 ES6 規(guī)范中加入了 Proxy 與 Reflect 兩個(gè)新特性,這兩個(gè)新特性增強(qiáng)了 JavaScript 中對(duì)象訪問的可控性,使得 JS 模塊、類的封裝能夠更加嚴(yán)密與簡(jiǎn)單,也讓操作對(duì)象時(shí)的報(bào)錯(cuò)變得更加可控。
Proxy
Proxy,正如其名,代理。這個(gè)接口可以給指定的對(duì)象創(chuàng)建一個(gè)代理對(duì)象,對(duì)代理對(duì)象的任何操作,如:訪問屬性、對(duì)屬性賦值、函數(shù)調(diào)用,都會(huì)被攔截,然后交由我們定義的函數(shù)來處理相應(yīng)的操作,
JavaScript 的特性讓對(duì)象有很大的操作空間,同時(shí) JavaScript 也提供了很多方法讓我們?nèi)ジ脑鞂?duì)象,可以隨意添加屬性、隨意刪除屬性、隨意更改對(duì)象的原型……但是此前 Object 類提供的 API 有許多缺點(diǎn):
- 如果要用 Object.defineProperty 定義某個(gè)名稱集合內(nèi)的全部屬性,只能通過枚舉的方式為全部屬性設(shè)置 getter 和 setter,而且由于只能每個(gè)屬性創(chuàng)造一個(gè)函數(shù),集合太大會(huì)造成性能問題。
- Object.defineProperty 定義后的屬性,如果仍想擁有正常的存取功能,只能將數(shù)據(jù)存放在對(duì)象的另一個(gè)屬性名上或者需要另一個(gè)對(duì)象來存放數(shù)據(jù),對(duì)于只想監(jiān)聽屬性的場(chǎng)合尤為不便。
- Object.defineProperty 無法修改類中不可重新定義的屬性,例如數(shù)組的 length 屬性。
- 對(duì)于那些尚不存在且名稱不好預(yù)測(cè)的屬性,Object.defineProperty 愛莫能助。
- 無法修改或阻止某些行為,如:枚舉屬性名、修改對(duì)象原型。
Proxy 接口的出現(xiàn)很好地解決了這些問題:
- Proxy 接口將對(duì)對(duì)象的所有操作歸類到數(shù)個(gè)類別中,通過 Proxy 提供的陷阱攔截特定的操作,再在我們定義的處理函數(shù)中進(jìn)行邏輯判斷就可以實(shí)現(xiàn)復(fù)雜的功能,并且還能控制比以前