代理(Proxy)可以攔截并改變 JS 引擎的底層操作,如數(shù)據(jù)讀取、屬性定義、函數(shù)構(gòu)造等一系列操作。ES6 通過對這些底層內(nèi)置對象的代理陷阱和反射函數(shù),讓開發(fā)者能進一步接近 JS 引擎的能力。
一、代理與反射的基本概念
什么是代理和反射呢?
代理是用來替代另一個對象(target),JS 通過new Proxy()創(chuàng)建一個目標對象的代理,該代理與該目標對象表面上可以被當作同一個對象來對待。
當目標對象上的進行一些特定的底層操作時,代理允許你攔截這些操作并且覆寫它,而這原本只是 JS 引擎的內(nèi)部能力。
如果你對些代理&反射的概念比較困惑的話,可以直接看后面的應(yīng)用示例,最后再重新看這些定義就會更清晰!
攔截行為使用了一個能夠響應(yīng)特定操作的函數(shù)( 被稱為陷阱),每個代理陷阱對應(yīng)一個反射(Reflect)方法。
ES6 的反射 API 以 Reflect 對象的形式出現(xiàn),對象每個方法都與對應(yīng)的陷阱函數(shù)同名,并且接收的參數(shù)也與之一致。以下是 Reflect 對象的一些方法:
| 代理陷阱 | 覆寫的特性 | 方法 | |
|---|---|---|---|
| get | 讀取一個屬性的值 | Reflect.get() | |
| set | 寫入一個屬性 | Reflect.set() | |
| has | in 運算符 | Reflect.has() | |
| deleteProperty | delete 運算符 | Reflect.deleteProperty() | |
| getPrototypeOf | Object.getPrototypeOf() | Reflect.getPrototypeOf() | |
| isExtensible | Object.isExtensible() | Reflect.isExtensible() | |
| defineProperty | Object.defineProperty() | Reflect.defineProperty | |
| apply | 調(diào)用一個函數(shù) | Reflect.apply() | |
| construct | 使用 new 調(diào)用一個函數(shù) | Reflect.construct() |
每個陷阱函數(shù)都可以重寫 JS 對象的一個特定內(nèi)置行為,允許你攔截并修改它。
綜合來說,想要控制或改變JS的一些底層操作,可以先創(chuàng)建一個代理對象,在這個代理對象上掛載一些陷阱函數(shù),陷阱函數(shù)里面有反射方法。通過接下來的應(yīng)用示例可以更清晰的明白代理的過程。
二、開始一個簡單的代理
當你使用 Proxy 構(gòu)造器來創(chuàng)建一個代理時,需要傳遞兩個參數(shù):目標對象(target)以及一個處理器( handler),
新聞熱點
疑難解答
圖片精選