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 选中文字并响应获取的实现代码
Aug 28 Javascript
基于jQuery实现最基本的淡入淡出效果实例
Feb 02 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
Feb 26 Javascript
JavaScript中constructor()方法的使用简介
Jun 05 Javascript
微信小程序  Mustache语法详细介绍
Oct 27 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
完美实现js焦点轮播效果(一)
Mar 07 Javascript
JS实现的四级密码强度检测功能示例
May 11 Javascript
Angularjs自定义指令Directive详解
May 27 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
Jun 19 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
vue编写简单的购物车功能
2021/01/08 Vue.js
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
python实现大学人员管理系统
2019/10/25 Python
python实现滑雪者小游戏
2020/02/22 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
运动会广播稿400字
2014/01/25 职场文书
调研座谈会发言材料
2014/08/23 职场文书
树转促学习心得体会
2014/09/10 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书