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 相关文章推荐
javascript Math.random()随机数函数
Nov 04 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
如何将php数组或者对象传递给javascript
Mar 20 Javascript
JavaScript验证电子邮箱的函数
Aug 22 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
Jan 20 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
Feb 16 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
vue实现城市列表选择功能
Jul 16 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
CI框架附属类用法分析
2018/12/26 PHP
php查询内存信息操作示例
2019/05/09 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
JS 判断代码全收集
2009/04/28 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Python requests模块实例用法
2019/02/11 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
Python 控制终端输出文字的实例
2019/07/12 Python
python对常见数据类型的遍历解析
2019/08/27 Python
Python修改列表值问题解决方案
2020/03/06 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
经贸日语专业个人求职信
2013/12/13 职场文书
运动会四百米广播稿
2014/01/19 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
教师考核评语
2014/04/28 职场文书
mysql知识点整理
2021/04/05 MySQL