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 相关文章推荐
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
运算符&amp;&amp;的三个不同层次
Apr 07 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
jQuery中outerWidth()方法用法实例
Jan 19 Javascript
javascript中this的四种用法
May 11 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
js实现一个简单的MVVM框架示例
Jan 15 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 Vue.js
MutationObserver在页面水印实现起到的作用详解
Jul 07 Javascript
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
PHP5/ZendEngine2的改进
2006/10/09 PHP
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
小程序api实现promise封装过程解析
2019/11/21 Javascript
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python类属性与实例属性用法分析
2015/05/09 Python
Python中几种导入模块的方式总结
2017/04/27 Python
python之信息加密题目详解
2019/06/26 Python
pandas的排序和排名的具体使用
2019/07/31 Python
django创建超级用户过程解析
2019/09/18 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
HSRP的含义以及如何工作
2014/09/10 面试题
文员自我评价怎么写
2013/09/19 职场文书
通信专业个人自我鉴定
2013/10/21 职场文书
个性车贴标语
2014/06/24 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers