JavaScript职责链模式概述

 更新时间:2016年09月17日 12:27:12   作者:猴子  
这篇文章主要为大家详细介绍了JavaScript职责链模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、概述 

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

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

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

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

二、利用职责链模拟冒泡 

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


比如,当我们触发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实用方法之json合并的场景分析

    Javascript实用方法之json合并的场景分析

    这篇文章主要介绍了Javascript实用方法之json合并,jQuery 的“extend()”方法有两个原型:合并的方法,分别是浅合并和深度合并,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • JavaScript实现图片懒加载的三种常用方法总结

    JavaScript实现图片懒加载的三种常用方法总结

    懒加载是一种对网页性能优化的方式,也是我们经常会用到的技术,这篇文章为大家整理了JavaScript实现图片懒加载的三种常用方法,希望对大家有所帮助
    2023-06-06
  • var let const关键字之间的区别及使用场景示例详解

    var let const关键字之间的区别及使用场景示例详解

    这篇文章主要为大家介绍了var let const关键字之间的区别及使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • js前端上传文件缩略图技巧示例详解

    js前端上传文件缩略图技巧示例详解

    这篇文章主要为大家介绍了js前端上传文件缩略图技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 使用rollup打包JS的方法步骤

    使用rollup打包JS的方法步骤

    这篇文章主要介绍了使用rollup打包JS的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • php输出全部gb2312编码内的汉字方法

    php输出全部gb2312编码内的汉字方法

    下面小编就为大家带来一篇php输出全部gb2312编码内的汉字方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 使用bootstrap莫名其妙出现横向滚动条的问题及解决

    使用bootstrap莫名其妙出现横向滚动条的问题及解决

    这篇文章主要介绍了使用bootstrap莫名其妙出现横向滚动条的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 根据输入邮箱号跳转到相应登录地址的解决方法

    根据输入邮箱号跳转到相应登录地址的解决方法

    本文分享了基于javascript实现的根据输入邮箱号跳转到相应登录地址的具体实例代码,需要的朋友一起来看下吧
    2016-12-12
  • 使用Github Actions发布npm包完整过程详解

    使用Github Actions发布npm包完整过程详解

    本文包含本地发布npm包发布流程, 和 github action自动发布npm包流程,帮助你更好的发布自己或公司的npm包,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • JavaScript中防抖和节流的实战应用记录

    JavaScript中防抖和节流的实战应用记录

    防抖与节流都是用来限制用户频发触发事件的机制,下面这篇文章主要给大家介绍了关于JavaScript中防抖和节流的实战应用,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论