JavaScript观察者模式(publish/subscribe)原理与实现方法


Posted in Javascript onMarch 30, 2017

本文实例讲述了JavaScript观察者模式(publish/subscribe)原理与实现方法。分享给大家供大家参考,具体如下:

观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。

在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持。在JavaScript中事件监听机制就可以理解为一种观察者模式。

下面给出一个JS自定义的PubSub,仔细阅读下面这段代码有助于你理解观察者模式。相关代码请查看github。

function PubSub() {
 this.handlers = {};
}
PubSub.prototype = {
  // 订阅事件
  on: function(eventType, handler){
    var self = this;
    if(!(eventType in self.handlers)) {
      self.handlers[eventType] = [];
    }
    self.handlers[eventType].push(handler);
    return this;
  },
   // 触发事件(发布事件)
  emit: function(eventType){
    var self = this;
    var handlerArgs = Array.prototype.slice.call(arguments,1);
    for(var i = 0; i < self.handlers[eventType].length; i++) {
     self.handlers[eventType][i].apply(self,handlerArgs);
    }
    return self;
  },
  // 删除订阅事件
  off: function(eventType, handler){
    var currentEvent = this.handlers[eventType];
    var len = 0;
    if (currentEvent) {
      len = currentEvent.length;
      for (var i = len - 1; i >= 0; i--){
        if (currentEvent[i] === handler){
          currentEvent.splice(i, 1);
        }
      }
    }
    return this;
  }
};
var pubsub = new PubSub();
var callback = function(data){
  console.log(data);
};
//订阅事件A
pubsub.on('A', function(data){
  console.log(1 + data);
});
pubsub.on('A', function(data){
  console.log(2 + data);
});
pubsub.on('A', callback);
//触发事件A
pubsub.emit('A', '我是参数');
//删除事件A的订阅源callback
pubsub.off('A', callback);
pubsub.emit('A', '我是第二次调用的参数');

运行结果。

JavaScript观察者模式(publish/subscribe)原理与实现方法

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
jQuery插件分享之分页插件jqPagination
Jun 06 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
使用impress.js制作幻灯片
Sep 09 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 Javascript
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
vue引入Excel表格插件的方法
Apr 28 Vue.js
Angular.js去除页面中显示的空行方法示例
Mar 30 #Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 #Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 #Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 #Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 #Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 #jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 #jQuery
You might like
php中长文章分页显示实现代码
2012/09/29 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
php查询操作实现投票功能
2016/05/09 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
js 作用域和变量详解
2017/02/16 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
python根据路径导入模块的方法
2014/09/30 Python
Python读写unicode文件的方法
2015/07/10 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
小学音乐教学反思
2014/02/05 职场文书
节能宣传周活动总结
2014/05/08 职场文书
5s标语大全
2014/06/23 职场文书
2014离婚协议书范文
2014/09/10 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS