频道栏目
首页 > 资讯 > JavaScript > 正文

js发布——订阅模式的通用实现及取消订阅

17-01-22        来源:[db:作者]  
收藏   我要投稿

发布——订阅模式的通用实现

javaScript作为一门解释执行的语言,给对象添加动态职责是理所当然的。所以我们将发布——订阅的功能提取出来,放在一个单独的对象内:

<script>  
       var event = {  
          clientList: {},  
          listen: function( key, fn ){             //添加订阅对象  
              if( !this.clientList[ key ] ){  
                 this.clientList[ key ] = [];  
              }  
              this.clientList[ key ].push( fn );  
          },   
          trigger: function(){                     //绑定发布事件  
             var key = Array.prototype.shift.apply( arguments ),  
                 fns = this.clientList[ key ];  
             for( var i = 0, fn; fn = fns[ i++]; ){  
                fn.apply( this, arguments );  
             }  
          },  
          remove: function( key, fn ){            //取消订阅的事件  
             var fns = this.clientList[ key ];  
               
             if( !fns ){                          //如果key对应的消息没有被人订阅,则直接返回    
                return false;  
             };  
             if( !fn ){                           //如果没有传入具体的回调函数,标示取消key对应消息的所有订阅   
                fns = [];  
             }else{  
                for( var i = fns.length - 1; i >= 0 ; i-- ){  //取消key对应的订阅消息  
                    if( fn === fns[ i ] ){  
                       fns.splice( i, 1 );  
                    }  
                }  
             }  
               
          }  
       };  
         
       var saleOffices = {};  
       var installEvent = function( obj ){  
          for( i in event ){  
            obj[ i ] = event[ i ];  
          }  
       };  
         
       installEvent( saleOffices );  
       saleOffices.listen( "squareMeter88", fn1 = function( price ){  
           console.log( "价格" + price );  
       } );  
       saleOffices.listen( "squareMeter88", function( price ){  
           console.log( "价格" + price );  
       } );  
       saleOffices.remove( "squareMeter88", fn1 );  
       saleOffices.trigger( "squareMeter88", 200000 );  
   </script>
相关TAG标签
上一篇:原生Ajax的多种简单封装
下一篇:css3动画—实现上拉提示指针动画
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站