js发布——订阅模式
2017-01-20 19:41
288 查看
<h1>js发布——订阅模式</h1> <p>发布—订阅模式幼教观察者模式,他定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所依赖于他的对象都将得到通知。 在javascript开发中,我们一般用事件模型来代替传统的发布-订阅模式。</p> <p>发布-订阅示例:</p> <script> var salesOffices = { //定义售楼处 clientList: [], //缓存列表,存放订阅者的回调函数 listen: function(fn){ //增加订阅者 this.clientList.push( fn ); //订阅的消息添加进缓存列表 }, trigger: function(){ //发布消息 for( var i = 0, fn; fn = this.clientList[ i++ ]; ){ fn.apply( this, arguments ); } } }; salesOffices.listen( function( price, squareMeter ){ console.log( "价格=" + price ); console.log( "squareMeter = " + squareMeter ); } ); salesOffices.listen( function( price, squareMeter ){ console.log( "价格=" + price ); console.log( "squareMeter = " + squareMeter ); } ); salesOffices.trigger( 200000, 88 ); </script> <p>至此,我们已经实现了一个最简单的发布——订阅模式,但这里还存在一些问题,那就是订阅者接受到了发布者发布的每个消息,所以,我们 有必要加上一个标示key,让订阅者只阅读自己感兴趣的消息。改写代码如下:</p> <script> var salesOffice = { clientList: {}, listen: function( key, fn ){ if( !this.clientList[ key ] ){ this.clientList[ key ] = []; }; this.clientList[ key ].push( fn ); }, trigger: function(){ var key = Array.prototype.shift.call( arguments ); fns = this.clientList[ key ]; if( !fns || fns.length ===0 ){ return false; }; for( var i = 0, fn; fn = fns[ i++ ]; ){ fn.apply( this, arguments ); } } }; salesOffice.listen( "squareMeter88", function( price ){ console.log( "价格 = " + price ); } ); salesOffice.listen( "squareMeter100", function( price ){ console.log( "价格 = " + price ); } ); salesOffice.trigger( "squareMeter88", 200000 ); salesOffice.trigger( "squareMeter100", 2000000 ); </script>
相关文章推荐
- 【JS】从零开始编一个JS游戏(4)
- 用JS改变HTML图像和样式
- jsp与html 区别
- js数组应用
- JS图片自动和可控的轮播切换特效
- JavaScript getFullYear() 方法
- [JS]js中判断变量类型函数typeof的用法汇总[转]
- js实现带有搜索框的可多选的动态下拉列表
- javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换.
- javascript的DOM操作 优化
- fastjson下对象转json时丢失属性的问题
- JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent
- zepto源码分析
- JS的unshift方法
- JSON.parse()和JSON.stringify(),HTML5本地存储localStorage、sessionStorage基本用法
- 用JavaScript截图
- JS圆
- JS在新标签页中打开链接URL,兼容IE,Chrome,Firefox
- javascript实现java的map对象,js实现new map()
- JSP_02 JSP生命周期