JavaScript职责链模式概述


Posted in Javascript onSeptember 17, 2016

一、概述 

职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。 

貌似和数据结构中的链表一样。 

但,不要搞混了,职责链可不等于链表哦,因为职责链可以在任何一个节点开始往下查找,而链表,则必须从头结点开始往下查找。 

比如,DOM事件机制中的冒泡事件就属于职责链,而捕获事件则属于链表。 

二、利用职责链模拟冒泡 

假设我们有三个对象:li、ul、div,三者关系图如下:

JavaScript职责链模式概述

比如,当我们触发li对象时,如果li没有阻止冒泡,那么将会传递给ul对象,到了ul,如果没有阻止冒泡,则会传递给div对象(假设这里div为根节点)。同理,ul、div。 

看到这儿,很清楚适合用职责链模式,编写这样的需求。 

但,怎么使用JavaScript实现职责链模式呢? 

如下,我们可以通过原型链的方式构建基本架构: 

function CreateDOM(obj){
  this.next = obj || null;
};  
CreateDOM.prototype = {
  handle: function(){
    if(this.next){
      this.next.handle();
    }
  }
};

每当我们利用CreateDOM构造函数,创建一个对象时,就将与之关联的对象传递进去(嗯,这样很链表)。 

然后,当我们触发某个对象,执行handle方法时,就可以沿着这条链,走下去了。 

但,需注意,当某个对象的handle属性覆盖了原型链中的handle时,怎么继续往下传呢? 

利用CreateDOM.prototype.handle.call(this);就好了。 

So,实现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);
  }
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
Jun 06 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
May 12 Javascript
10个JavaScript中易犯小错误
Feb 14 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
Vue表单验证插件的制作过程
Apr 01 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
Node.js搭建小程序后台服务
Jan 03 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 Javascript
JavaScript类的写法
Sep 17 #Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 #Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 #Javascript
JavaScript每天必学之数组和对象部分
Sep 17 #Javascript
JavaScript每天必学之基础知识
Sep 17 #Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 #Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 #Javascript
You might like
DSP接收机前端设想
2021/03/02 无线电
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
Python3读取zip文件信息的方法
2015/05/22 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
Python排序函数的使用方法详解
2020/12/11 Python
Pandas之缺失数据的实现
2021/01/06 Python
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
初二物理教学反思
2014/01/29 职场文书
教师师德反思材料
2014/02/15 职场文书
授权委托书范本
2014/04/03 职场文书
实习报告评语
2014/04/26 职场文书
实习推荐信
2014/05/10 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
批评与自我批评范文
2014/10/15 职场文书
2014年食堂工作总结
2014/11/20 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
门卫管理制度范本
2015/08/05 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS