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 相关文章推荐
JsEasy简介 JsEasy是什么?与下载
Mar 07 Javascript
js中split函数的使用方法说明
Dec 26 Javascript
javascript事件冒泡详解和捕获、阻止方法
Apr 12 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
jquery点击切换背景色的简单实例
Aug 25 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
Dec 03 Javascript
无法获取隐藏元素宽度和高度的解决方案
Mar 07 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
JS实现前端缓存的方法
Sep 21 Javascript
微信小程序事件流原理解析
Nov 27 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
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
Python对切片命名的实现方法
2018/10/16 Python
Python骚操作之动态定义函数
2019/03/26 Python
使用python实现滑动验证码功能
2019/08/05 Python
python文件读写代码实例
2019/10/21 Python
python中的逆序遍历实例
2019/12/25 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
HTML5 Canvas概述
2009/08/26 HTML / CSS
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
重阳节登山活动方案
2014/02/03 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
超市开店计划书
2014/04/26 职场文书
社团活动总结
2014/04/28 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server