JavaScript職責(zé)鏈模式概述
一、概述
職責(zé)鏈模式(Chain of responsibility),就是使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這個(gè)對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理他為止。
貌似和數(shù)據(jù)結(jié)構(gòu)中的鏈表一樣。
但,不要搞混了,職責(zé)鏈可不等于鏈表哦,因?yàn)槁氊?zé)鏈可以在任何一個(gè)節(jié)點(diǎn)開(kāi)始往下查找,而鏈表,則必須從頭結(jié)點(diǎn)開(kāi)始往下查找。
比如,DOM事件機(jī)制中的冒泡事件就屬于職責(zé)鏈,而捕獲事件則屬于鏈表。
二、利用職責(zé)鏈模擬冒泡
假設(shè)我們有三個(gè)對(duì)象:li、ul、div,三者關(guān)系圖如下:
比如,當(dāng)我們觸發(fā)li對(duì)象時(shí),如果li沒(méi)有阻止冒泡,那么將會(huì)傳遞給ul對(duì)象,到了ul,如果沒(méi)有阻止冒泡,則會(huì)傳遞給div對(duì)象(假設(shè)這里div為根節(jié)點(diǎn))。同理,ul、div。
看到這兒,很清楚適合用職責(zé)鏈模式,編寫(xiě)這樣的需求。
但,怎么使用JavaScript實(shí)現(xiàn)職責(zé)鏈模式呢?
如下,我們可以通過(guò)原型鏈的方式構(gòu)建基本架構(gòu):
function CreateDOM(obj){ this.next = obj || null; }; CreateDOM.prototype = { handle: function(){ if(this.next){ this.next.handle(); } } };
每當(dāng)我們利用CreateDOM構(gòu)造函數(shù),創(chuàng)建一個(gè)對(duì)象時(shí),就將與之關(guān)聯(lián)的對(duì)象傳遞進(jìn)去(嗯,這樣很鏈表)。
然后,當(dāng)我們觸發(fā)某個(gè)對(duì)象,執(zhí)行handle方法時(shí),就可以沿著這條鏈,走下去了。
但,需注意,當(dāng)某個(gè)對(duì)象的handle屬性覆蓋了原型鏈中的handle時(shí),怎么繼續(xù)往下傳呢?
利用CreateDOM.prototype.handle.call(this);就好了。
So,實(shí)現(xiàn)li、ul和div代碼如下:
var li = null, ul = null, div = null; div = new CreateDOM(); div.handle = function(stopBubble){ console.log('DIV'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } }; ul = new CreateDOM(div); ul.handle = function(stopBubble){ console.log('UL'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } }; li = new CreateDOM(ul); li.handle = function(stopBubble){ console.log('LI'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } };
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- javascript設(shè)計(jì)模式 – 職責(zé)鏈模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之職責(zé)鏈模式應(yīng)用示例
- 深入理解JavaScript系列(38):設(shè)計(jì)模式之職責(zé)鏈模式詳解
- JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述
- JavaScript設(shè)計(jì)模式--簡(jiǎn)單工廠模式定義與應(yīng)用案例詳解
- JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- JS 設(shè)計(jì)模式之:?jiǎn)卫J蕉x與實(shí)現(xiàn)方法淺析
- javascript設(shè)計(jì)模式 – 訪問(wèn)者模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 模板方法模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之職責(zé)鏈模式
相關(guān)文章
JavaScript中定時(shí)器setTimeout()和setInterval()的用法
本文詳細(xì)講解了JavaScript中定時(shí)器setTimeout()和setInterval()的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06JavaScript鍵盤(pán)事件常見(jiàn)用法實(shí)例分析
這篇文章主要介紹了JavaScript鍵盤(pán)事件常見(jiàn)用法,簡(jiǎn)單描述了javascript鍵盤(pán)事件的分類(lèi)、功能,并結(jié)合實(shí)例形式給出了javascript響應(yīng)鍵盤(pán)事件相關(guān)使用技巧,需要的朋友可以參考下2019-01-01一個(gè)字符串中出現(xiàn)次數(shù)最多的字符 統(tǒng)計(jì)這個(gè)次數(shù)【實(shí)現(xiàn)代碼】
下面小編就為大家?guī)?lái)一篇一個(gè)字符串中出現(xiàn)次數(shù)最多的字符 統(tǒng)計(jì)這個(gè)次數(shù)【實(shí)現(xiàn)代碼】。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考2016-04-04xml分頁(yè)+ajax請(qǐng)求數(shù)據(jù)源+dom取結(jié)果實(shí)例代碼
最近做的一個(gè)項(xiàng)目里的某個(gè)小功能,主要是為了方便選擇數(shù)據(jù) 演示地址:由于有惡意程序,所以去掉地址2008-10-10createElement與createDocumentFragment的點(diǎn)點(diǎn)區(qū)別小結(jié)
在DOM操作里,createElement是創(chuàng)建一個(gè)新的節(jié)點(diǎn),createDocumentFragment是創(chuàng)建一個(gè)文檔片段2011-12-12Bootstrap每天必學(xué)之折疊(Collapse)插件
Bootstrap每天必學(xué)之折疊(Collapse)插件,折疊插件可以很容易地讓頁(yè)面區(qū)域折疊起來(lái),感興趣的小伙伴們可以參考一下2016-04-04Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01關(guān)于javascript sort()排序你可能忽略的一點(diǎn)理解
最近在研究Javascript發(fā)現(xiàn)了其中一些之前忽略的問(wèn)題,所以想著總結(jié)分享出來(lái),下面這篇文章主要給大家介紹了關(guān)于javascript sort()排序你可能忽略的一點(diǎn)理解,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法
本文給大家簡(jiǎn)單總結(jié)了下JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2016-06-06