摘要:著名的代理模式例子為引用計(jì)數(shù)英語(yǔ)指針對(duì)象。是一個(gè)構(gòu)造函數(shù),是被代理的對(duì)象,是聲明了各類(lèi)代理操作的對(duì)象,最終返回一個(gè)代理對(duì)象。在給一個(gè)目標(biāo)對(duì)象為構(gòu)造函數(shù)的代理對(duì)象構(gòu)造實(shí)例時(shí)觸發(fā)該操作,比如在執(zhí)行時(shí)。
所謂的代理者是指一個(gè)類(lèi)別可以作為其它東西的接口。代理者可以作任何東西的接口:網(wǎng)絡(luò)連接、內(nèi)存中的大對(duì)象、文件或其它昂貴或無(wú)法復(fù)制的資源。
著名的代理模式例子為引用計(jì)數(shù)(英語(yǔ):reference counting)指針對(duì)象。
當(dāng)一個(gè)復(fù)雜對(duì)象的多份副本須存在時(shí),代理模式可以結(jié)合享元模式以減少內(nèi)存用量。典型作法是創(chuàng)建一個(gè)復(fù)雜對(duì)象及多個(gè)代理者,每個(gè)代理者會(huì)引用到原本的復(fù)雜對(duì)象。而作用在代理者的運(yùn)算會(huì)轉(zhuǎn)送到原本對(duì)象。一旦所有的代理者都不存在時(shí),復(fù)雜對(duì)象會(huì)被移除。
var backPhoneList = ["12345566"];//黑色單列表 // 代理 var ProxyAcceptPhone = function(phone){ console.log("電話(huà)正在接入...") if(backPhoneList.includes(phone)){ console.log("屏蔽黑名單電話(huà)") }else{ // 轉(zhuǎn)接 AcceptPhone.call(this,phone) } } // 本體 var AcceptPhone = function(phone){ console.log("接聽(tīng)電話(huà)",phone) } // 外部調(diào)用代理 ProxyAcceptPhone("12345566") ProxyAcceptPhone("18900044440")
什么是Proxy對(duì)象 ========== **Proxy對(duì)象就是可以讓你去對(duì)JavaScript中的一切合法對(duì)象的基本操作進(jìn)行自定義.然后用你自定義的操作去覆蓋其對(duì)象的基本操作.也就是當(dāng)一個(gè)對(duì)象去執(zhí)行一個(gè)基本操作時(shí),其執(zhí)行的過(guò)程和結(jié)果是你自定義的,而不是對(duì)象的** 首先Proxy的語(yǔ)法是: let p = new Proxy(target, handler); 1. target是你要代理的對(duì)象.它可以是JavaScript中的任何合法對(duì)象.如: (數(shù)組, 對(duì)象, 函數(shù)等等) 2. handler是你要自定義操作方法的一個(gè)集合. 3. p是一個(gè)被代理后的新對(duì)象,它擁有target的一切屬性和方法.只不過(guò)其行為和結(jié)果是在handler中自定義的. 在支持 Proxy 的瀏覽器環(huán)境中,Proxy 是一個(gè)全局對(duì)象, 可以直接使用。Proxy(target, handler) 是一個(gè)構(gòu)造函數(shù),target 是被代理的對(duì)象, handlder 是聲明了各類(lèi)代理操作的對(duì)象,最終返回一個(gè)代理對(duì)象。 外界每次通過(guò)代理對(duì)象訪(fǎng)問(wèn) target 對(duì)象的屬性時(shí),就會(huì)經(jīng)過(guò) handler 對(duì)象, 從這個(gè)流程來(lái)看,代理對(duì)象很類(lèi)似 middleware(中間件)。 那么 Proxy 可以攔截什么操作呢? 最常見(jiàn)的就是 get(讀?。?、set(修改)對(duì)象屬性等操作, 此外,Proxy 對(duì)象還提供了一個(gè) revoke 方法,可以隨時(shí)注銷(xiāo)所有的代理操作。
let obj ={ a:1, b:2 } const p = new Proxy(obj,{ get(target,key,value){ if(key == "c"){ return "我是自定義的2一個(gè)結(jié)果" }else{ return target[key]; } }, set(target,key,value){ if(value==4){ target[key]="我是自定義的一個(gè)結(jié)果" }else{ target[key] = value; } } }) console.log(obj.a)//1 console.log(obj.c)//underfined console.log(p.a)//1 console.log(p.c)//我是自定義的一個(gè)結(jié)果 obj.name = "李白" console.log(obj.name)//李白 console.log(p.name)//李白 p.age=4 console.log(obj.age)//我是自定義的一個(gè)結(jié)果 console.log(p.age)//我是自定義的一個(gè)結(jié)果
**Proxy對(duì)象的作用.即是之前所受的用于定義基本操作的自定義行為. 同樣的get和set操作.沒(méi)有沒(méi)代理的對(duì)象所得的結(jié)果是其JavaScript本身的執(zhí)行機(jī)制運(yùn)行計(jì)算后所得到的. 而被代理了的對(duì)象的結(jié)果則是我們自定義的.** Proxy所能代理的范圍--handler **在上面代碼中,我們看到了構(gòu)造一個(gè)代理對(duì)象時(shí)所傳的第二個(gè)參數(shù)handler, 這個(gè)handler對(duì)象是由get和set兩個(gè)函數(shù)方法組成的. 這兩個(gè)方法會(huì)在一個(gè)對(duì)象被get和set時(shí)被調(diào)用執(zhí)行, 以代替原生對(duì)象上的操作.那么為什么在handler, 定義get和set這兩個(gè)函數(shù)名之后就代理對(duì)象上的get和set操作了呢? 實(shí)際上handler本身就是ES6所新設(shè)計(jì)的一個(gè)對(duì)象.它的作用就是用來(lái)自定義代理對(duì)象的各種可代理操作。 它本身一共有13中方法,每種方法都可以代理一種操作.其13種方法如下: handler.getPrototypeOf() // 在讀取代理對(duì)象的原型時(shí)觸發(fā)該操作,比如在執(zhí)行 Object.getPrototypeOf(proxy) 時(shí)。 handler.setPrototypeOf() // 在設(shè)置代理對(duì)象的原型時(shí)觸發(fā)該操作,比如在執(zhí)行 Object.setPrototypeOf(proxy, null) 時(shí)。 handler.isExtensible() // 在判斷一個(gè)代理對(duì)象是否是可擴(kuò)展時(shí)觸發(fā)該操作,比如在執(zhí)行 Object.isExtensible(proxy) 時(shí)。 handler.preventExtensions() // 在讓一個(gè)代理對(duì)象不可擴(kuò)展時(shí)觸發(fā)該操作,比如在執(zhí)行 Object.preventExtensions(proxy) 時(shí)。 handler.getOwnPropertyDescriptor() // 在獲取代理對(duì)象某個(gè)屬性的屬性描述時(shí)觸發(fā)該操作, //比如在執(zhí)行 Object.getOwnPropertyDescriptor(proxy, "foo") 時(shí)。 handler.defineProperty() // 在定義代理對(duì)象某個(gè)屬性時(shí)的屬性描述時(shí)觸發(fā)該操作, //比如在執(zhí)行 Object.defineProperty(proxy, "foo", {}) 時(shí)。 handler.has() // 在判斷代理對(duì)象是否擁有某個(gè)屬性時(shí)觸發(fā)該操作,比如在執(zhí)行 "foo" in proxy 時(shí)。 handler.get() // 在讀取代理對(duì)象的某個(gè)屬性時(shí)觸發(fā)該操作,比如在執(zhí)行 proxy.foo 時(shí)。 handler.set() // 在給代理對(duì)象的某個(gè)屬性賦值時(shí)觸發(fā)該操作,比如在執(zhí)行 proxy.foo = 1 時(shí)。 handler.deleteProperty() // 在刪除代理對(duì)象的某個(gè)屬性時(shí)觸發(fā)該操作,比如在執(zhí)行 delete proxy.foo 時(shí)。 handler.ownKeys() // 在獲取代理對(duì)象的所有屬性鍵時(shí)觸發(fā)該操作,比如在執(zhí)行 Object.getOwnPropertyNames(proxy) 時(shí)。 handler.apply() // 在調(diào)用一個(gè)目標(biāo)對(duì)象為函數(shù)的代理對(duì)象時(shí)觸發(fā)該操作,比如在執(zhí)行 proxy() 時(shí)。 handler.construct() // 在給一個(gè)目標(biāo)對(duì)象為構(gòu)造函數(shù)的代理對(duì)象構(gòu)造實(shí)例時(shí)觸發(fā)該操作,比如在執(zhí)行new proxy() 時(shí)。 ** Proxy的作用 對(duì)于代理模式Proxy的作用主要體現(xiàn)在三個(gè)方面: 1、 攔截和監(jiān)視外部對(duì)對(duì)象的訪(fǎng)問(wèn) 2、 降低函數(shù)或類(lèi)的復(fù)雜度 3、 在復(fù)雜操作前對(duì)操作進(jìn)行校驗(yàn)或?qū)λ栀Y源進(jìn)行管理
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106334.html
摘要:面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之代理模式,相信很多朋友已經(jīng)很熟悉了。代表當(dāng)前執(zhí)行方法的實(shí)例,即方法調(diào)用者。代表具體的方法名稱(chēng)?,F(xiàn)在我們?cè)俅握{(diào)用,傳入構(gòu)造器返回的代理對(duì)象打印輸出,代理邏輯生效了和的一樣優(yōu)雅地實(shí)現(xiàn)了代理設(shè)計(jì)模式。 showImg(https://segmentfault.com/img/remote/1460000016760603);面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之Proxy(代理...
摘要:注意事項(xiàng)聲明函數(shù)時(shí)候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實(shí)現(xiàn)初始化構(gòu)造函數(shù)大寫(xiě)字母開(kāi)頭推薦注意的成本。簡(jiǎn)單工廠模式使用一個(gè)類(lèi)通常為單體來(lái)生成實(shí)例。 @(書(shū)籍閱讀)[JavaScript, 設(shè)計(jì)模式] 常見(jiàn)設(shè)計(jì)模式 一直對(duì)設(shè)計(jì)模式不太懂,花了一下午加一晚上的時(shí)間,好好的看了看各種設(shè)計(jì)模式,并總結(jié)了一下。 設(shè)計(jì)模式簡(jiǎn)介 設(shè)計(jì)模式概念解讀 設(shè)計(jì)模式的發(fā)展與在JavaScript中的應(yīng)用 ...
摘要:保護(hù)代理和虛擬代理保護(hù)代理當(dāng)有許多需求要向某對(duì)象發(fā)出一些請(qǐng)求時(shí),可以設(shè)置保護(hù)代理,通過(guò)一些條件判斷對(duì)請(qǐng)求進(jìn)行過(guò)濾。虛擬代理在程序中可以能有一些代價(jià)昂貴的操作。而虛擬代理是最常用的一種代理模式。 代理模式 代理模式是為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)它的訪(fǎng)問(wèn)。 保護(hù)代理和虛擬代理 保護(hù)代理:當(dāng)有許多需求要向某對(duì)象發(fā)出一些請(qǐng)求時(shí),可以設(shè)置保護(hù)代理,通過(guò)一些條件判斷對(duì)請(qǐng)求進(jìn)行過(guò)濾。...
摘要:缺點(diǎn)不符合開(kāi)閉原則,如果要改東西很麻煩,繼承重寫(xiě)都不合適。預(yù)防低水平人員帶來(lái)的風(fēng)險(xiǎn)。開(kāi)閉原則,高拓展性。這里的訂閱者稱(chēng)為觀察者,而被觀察者稱(chēng)為發(fā)布者,當(dāng)一個(gè)事件發(fā)生,發(fā)布者會(huì)發(fā)布通知所有訂閱者,并常常以事件對(duì)象形式傳遞消息。 介紹 最近開(kāi)始給自己每周訂個(gè)學(xué)習(xí)任務(wù),學(xué)習(xí)結(jié)果反饋為一篇文章的輸出,做好學(xué)習(xí)記錄。 這一周(02.25-03.03)我定的目標(biāo)是《JavaScript 模式》...
摘要:虛擬代理延遲執(zhí)行虛擬代理的目的,是將開(kāi)銷(xiāo)大的運(yùn)算延遲到需要時(shí)再執(zhí)行。 showImg(https://segmentfault.com/img/bVbuitm?w=800&h=600); 代理模式:為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制它的訪(fǎng)問(wèn)。 當(dāng)我們不方便直接訪(fǎng)問(wèn)某個(gè)對(duì)象時(shí),或不滿(mǎn)足需求時(shí),可考慮使用一個(gè)替身對(duì)象來(lái)控制該對(duì)象的訪(fǎng)問(wèn)。替身對(duì)象可對(duì)請(qǐng)求預(yù)先進(jìn)行處理,再?zèng)Q定是否轉(zhuǎn)交給...
閱讀 2322·2023-04-26 00:01
閱讀 809·2021-10-27 14:13
閱讀 1839·2021-09-02 15:11
閱讀 3392·2019-08-29 12:52
閱讀 542·2019-08-26 12:00
閱讀 2574·2019-08-26 10:57
閱讀 3416·2019-08-26 10:32
閱讀 2858·2019-08-23 18:29