// 观者着应该有:一个消息容器和三个方法,三个方法分别是:
// 订阅消息的方法,取消订阅的消息方法,发布订阅消息的方法
/**
* 消息注册的方法,注册方法的作用就是将订阅者注册的消息推入到消息队列中,因此我们需要两个参数
* 消息类型以及相应的处理动作,在推入到消息队列时,如果此消息不存在则应该创建一个消息类型并将
* 该消息放入消息队伍中,如果此消息存在则应该将消息执行方法推入该消息对应的执行方法队伍中,
* 这么做的目的也是保证多个模块注册同一则消息时能顺利执行
* /
/**
* 将观察者放在闭包中,当页面加载就立即执行
*/
var Observer = function () {
/**
* 防止消息队列暴漏而被篡改故将消息容器作为静态私有变量保存
*/
var _message = {};
return {
/**
* 注册消息的接口
*/
regist: function (type, fn) {
if (typeof _message[type] === 'undefined') {
_message[type] = [fn];
}else {
_message[type].push(fn);
}
},
/**
* 发布消息的接口
*/
fire: function (type, args) {
// 如果该消息没有被注册,则返回
console.log(_message)
if (!_message[type]) return;
var events = {
type: type,
args: args || {}
},
i = 0,
len = _message[type].length
for(; i < len; i++) {
_message[type][i].call(this, events);
}
},
/**
* 移除消息的接口
*/
remove: function (type, fn) {
if(_message[type] instanceof Array) {
var i = _message[type].length -1;
for (; i >=0; i--) {
_message[type][i] === fn && _message[type].splice(i, 1);
}
}
console.log('已经删除了');
console.log(_message);
}
}
}
var testObs = Observer();
function testFn (e) {
console.log(e.type, e.args.msg);
}
testObs.regist('test', testFn);
testObs.fire('test', {msg: '传递测试参数'});
testObs.remove('test', testFn)