刚看了一下seajs,突发奇想写一个事件的分发模块,可以方便的进行事件的播放已经监听,可偷懒的解决循环依赖或者较为麻烦的不同模块的controller之间的通信:
define(function (require, exports, module) {
function EventEmitter() {
var self = this;
if (!self.hasOwnProperty('events')) {
Object.defineProperty(self, 'events', {
value: {},
writable: false
});
}
if (!self.hasOwnProperty('$on')) {
Object.defineProperty(self, '$on', {
value: function (name, cb) {
if (typeof name == 'string' && typeof cb == 'function') {
if (!self.events.hasOwnProperty(name)) {
Object.defineProperty(self.events, name, {
value: [],
writable: false
});
}
if (self.events[name].indexOf(cb) < 0) {
self.events[name].push(cb);
}
}
},
writable: false
});
}
if (!self.hasOwnProperty('$emit')) {
Object.defineProperty(self, '$emit', {
value: function (name, data) {
if (typeof name == 'string' && self.events.hasOwnProperty(name)) {
self.events[name].forEach(function (func) {
if (typeof func == 'function') {
func(data);
}
});
}
},
writable: false
});
}
}
module.exports = new EventEmitter();
});
代码非常简单,功能也非常简单,通过$on来监听事件,注册监听函数,通过$emit来发送事件消息,没有做其他的例如阻止冒泡之类的操作,仅供交流。