发布/订阅模式

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>发布&订阅模式</title>
<script>
var PubSub = {
  subscribe: function (ev, callback) {
        // 创建 _callbacks 对象,除非它已经存在了
        var calls = this._callbacks || (this._callbacks = {});
        
        // 针对给定的事件 key 创建一个数组,除非这个数组已经存在
        // 然后将毁掉函数追加到这个数组中
        (this._callbacks[ev] || (this._callbacks[ev] = [])).push(callback);
        return this;
    },
    
    publish: function () {
        // 将 arguments 对象转化为真正的数组
        var args = Array.prototype.slice.call(arguments, 0);
        
        // 拿出第 1 个参数,即事件名称
        var ev = args.shift();
        
        // 如果不存在,_callbacks 对象,则返回
        // 或者如果不包含给定事件对应的数组
        var list, calls, i, l;
        if (!(calls = this._callbacks)) return this;
        if (!(list = this._callbacks[ev])) return this;
        
        // 触发回调
        for (var i = 0, l = list.length; i < l; i++) {
            list[i].apply(this, args);
        }
        return this;
    }
};

// 使用方法
PubSub.subscribe('wem', function () {
    alert('Wem');
});

PubSub.publish('wem');
</script>
</head>

<body>
</body>
</html>

 

posted @ 2013-03-27 19:18  baiezone  阅读(242)  评论(0编辑  收藏  举报