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)開始往下查找,而鏈表,則必須從頭結(jié)點(diǎn)開始往下查找。
比如,DOM事件機(jī)制中的冒泡事件就屬于職責(zé)鏈,而捕獲事件則屬于鏈表。
二、利用職責(zé)鏈模擬冒泡
假設(shè)我們有三個(gè)對(duì)象:li、ul、div,三者關(guān)系圖如下:

比如,當(dāng)我們觸發(fā)li對(duì)象時(shí),如果li沒有阻止冒泡,那么將會(huì)傳遞給ul對(duì)象,到了ul,如果沒有阻止冒泡,則會(huì)傳遞給div對(duì)象(假設(shè)這里div為根節(jié)點(diǎn))。同理,ul、div。
看到這兒,很清楚適合用職責(zé)鏈模式,編寫這樣的需求。
但,怎么使用JavaScript實(shí)現(xiàn)職責(zé)鏈模式呢?
如下,我們可以通過原型鏈的方式構(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);
}
};
以上就是本文的全部內(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ì)模式--簡單工廠模式定義與應(yīng)用案例詳解
- JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- JS 設(shè)計(jì)模式之:單例模式定義與實(shí)現(xiàn)方法淺析
- javascript設(shè)計(jì)模式 – 訪問者模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 模板方法模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之職責(zé)鏈模式
相關(guān)文章
JavaScript DOM節(jié)點(diǎn)添加示例
本節(jié)為大家介紹下JavaScript DOM節(jié)點(diǎn)添加,將node里面的str放到h1段落中使之成為h1的新段落2014-07-07
使用apply方法處理數(shù)組的三個(gè)技巧[譯]
本文要講的是使用apply方法處理數(shù)組的三個(gè)技巧,需要的朋友可以參考下2012-09-09
javascript實(shí)現(xiàn)的顏色塊滑動(dòng)的動(dòng)態(tài)效果
javascript實(shí)現(xiàn)的顏色塊滑動(dòng)的動(dòng)態(tài)效果...2007-08-08
JS實(shí)現(xiàn)基于Sketch.js模擬成群游動(dòng)的蝌蚪運(yùn)動(dòng)動(dòng)畫效果【附demo源碼下載】
這篇文章主要介紹了JS實(shí)現(xiàn)基于Sketch.js模擬成群游動(dòng)的蝌蚪運(yùn)動(dòng)動(dòng)畫效果,涉及Sketch.js插件的使用及HTML5元素的應(yīng)用技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-08-08
JS 中LocalStorage和SessionStorage的使用
最近因?yàn)轫?xiàng)目上需要使用到客戶端存儲(chǔ),所以稍微研究了一下,以下說說自己的理解和使用經(jīng)驗(yàn),特此分享到腳本之家平臺(tái),感興趣的朋友參考下吧2017-08-08
解決layui頁面按鈕點(diǎn)擊無反應(yīng),也不報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決layui頁面按鈕點(diǎn)擊無反應(yīng),也不報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript必看的10道面試題總結(jié)(推薦)
JavaScript 已經(jīng)成為全棧開發(fā)技能的基石,在全棧開發(fā)面試中都會(huì)不可避免地涉及到與 JavaScript 有關(guān)的問題。這篇文章主要給大家介紹了關(guān)于JavaScript必看的10道面試題,需要的朋友可以參考下2021-05-05
JavaScript中的scrollTop詳解(滾動(dòng)到頂部)
scrollTop是JavaScript中一個(gè)非常有用且重要的方法,它用于獲取或設(shè)置元素的垂直滾動(dòng)條位置,這篇文章主要給大家介紹了關(guān)于JavaScript中scrollTop詳解(滾動(dòng)到頂部)的相關(guān)資料,需要的朋友可以參考下2023-12-12

