JavaScript中代理對(duì)象的示例分析

這篇文章主要介紹JavaScript中代理對(duì)象的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

為東湖等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及東湖網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、成都做網(wǎng)站、東湖網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

JavaScript 支持 setters 和 getters 已經(jīng)很長(zhǎng)時(shí)間了。他們用帶有 set 和 get  關(guān)鍵字的簡(jiǎn)單語(yǔ)法來(lái)攔截對(duì)象的屬性訪問(wèn)和值的修改操作。

const obj = {   propValue: 1,   get prop() {     console.log("Retrieving property prop");     return this.propValue;   },   set prop(value) {     console.log("Setting property prop to", value);     this.propValue = value;   } };  obj.prop; // 1 | [in console] Retrieving  property prop obj.prop = 2; // [in console] Setting property prop to 2  1234567891011121314

但是,setter/getter 有多個(gè)缺點(diǎn):

  • 它們僅限 get 和 get 操作(顯然)。

  • 它們不能與相同鍵(即“常規(guī)”屬性)的數(shù)據(jù)入口一起使用。

  • 它們不是動(dòng)態(tài)的,必須在對(duì)象聲明期間用靜態(tài)的 Object.defineProperty()  方法或通過(guò)使用計(jì)算值(僅適用于新的瀏覽器)顯式地應(yīng)用于每個(gè)屬性。

// ... Object.defineProperty(obj, "anotherProp", {   get() {     /* Do something on get */   },   set(value) {     /*Do something on set */   } });  123456789

因此,setter 和 getter 不太適合觀察整個(gè)對(duì)象或執(zhí)行非常簡(jiǎn)單的操作。因此,ECMAScript 6(ES6)引入了代理對(duì)象(Proxy  object)。

代理(Proxy)

代理是內(nèi)置的 JS 對(duì)象,可用于攔截和更改與對(duì)象相關(guān)的不同操作的行為。

const originalObj = { prop: 1, anotherProp: "value" }; const proxyObj = new Proxy(originalObj, {   get(obj, prop) {     console.log("Retrieving property", prop);     return obj[prop];   },   set(obj, prop, value) {     console.log("Setting property", prop, "to", value);     obj[prop] = value;     return true;   } }); originalObj.prop; // 1 originalObj.prop = 2;  proxyObj.prop; // 2 | [in console] Retrieving property "prop" proxyObj.anotherProp = "new value"; // [in console] Setting property "anotherProp" to "new value"  1234567891011121314151617

很快我們就可以看到 Proxy 與 setter 和 getters 之間的區(qū)別。它們不僅在語(yǔ)法上有所不同(Proxy  更為冗長(zhǎng)),而且在與原始對(duì)象的交互方面也有所不同。Proxy會(huì)創(chuàng)建一個(gè)新對(duì)象供你與之交互,而不是與原始對(duì)象進(jìn)行交互,原始對(duì)象在使用 setter/getter  時(shí)會(huì)直接修改。

在使用 Proxy 的情況下,原始對(duì)象(也稱為 target)用作一種存儲(chǔ)。你對(duì)其執(zhí)行的任何操作都會(huì)直接影響代理,但不會(huì)觸發(fā)其任何 trap。

代理的 trap 是執(zhí)行特定操作時(shí)調(diào)用的簡(jiǎn)單方法。它們都是在單個(gè) handler 對(duì)象上定義的,然后傳遞給 Proxy 構(gòu)造函數(shù)。除此之外,它們不僅限于  set() 和 get(),還包括一些有趣的操作,你可以在 MDN 文檔中找到。

可撤銷代理

如果出于某種原因,你以后想取消或撤消代理,則應(yīng)該用靜態(tài)的 Proxy.revocable()方法創(chuàng)建它。

// ... const revocableProxyObj = Proxy.revocable(originalObj, {   get(obj, prop) {     /* Do something on get */   },   set(obj, prop, value) {     /*Do something on set */   } }); const proxy = revocableProxyObj.proxy; proxy.prop; // OK revocable.revoke(); proxy.prop // TypeError  12345678910111213

該方法不是直接返回 Proxy 對(duì)象,而是返回一個(gè)對(duì)象,該對(duì)象包含位于 proxy 屬性下的實(shí)際 Proxy 和一個(gè)附加的 revoke()  方法。

調(diào)用時(shí),此方法會(huì)使 Proxy 無(wú)效,使以后的任何調(diào)用均以 TypeError 結(jié)尾。之后該代理將被自動(dòng)“垃圾收集”,從而釋放內(nèi)存空間。

用例

與 setter/getter 相比,Proxy 可以讓你做更多的事情。它們更快(聲明后)并且更加靈活,使其成為狀態(tài)管理等用例的理想解決方案。

Proxy 帶來(lái)了很多可定制性,使開(kāi)發(fā)人員可以控制 JS  的某些元功能(meta-functionalities)。所以它們并不是向后兼容的,并且沒(méi)有任何完全兼容的 polyfill 的選項(xiàng)存在。話雖如此,根據(jù) Can  I use... 的數(shù)據(jù),總體的支持看上去不錯(cuò),覆蓋率約為 93%(不支持 IE 和 Safari <10 的版本)。

以上是“JavaScript中代理對(duì)象的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:JavaScript中代理對(duì)象的示例分析
文章轉(zhuǎn)載:http://bm7419.com/article48/gegihp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、企業(yè)建站、定制開(kāi)發(fā)網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)