该模式大多数用于自定义事件app
var event = {} event.cacheList = {} event.on = function (key, fn) { if (!event.cacheList[key]) { event.cacheList[key] = [] } event.cacheList[key].push(fn) } event.fire = function () { var key = Array.prototype.shift.apply(arguments) var fns = event.cacheList[key] if (!fns || fns.length === 0) { return false } for (var i = 0, len = fns.length; i < len; i++) { fns[i].apply(this, arguments) } } event.remove = function (key, fn) { var fns = event.cacheList[key] if (!fns || fns.length === 0) { return false } if (!fn) { fns && (fns.length = 0) } else { for (var i = 0, len = fns.length; i < len; i++) { if (fns[i] === fn) { fns.splice(i, 1) } } } } var installEvent = function (obj) { for (var key in event) { obj[key] = event[key] } } var sellOffice = {} installEvent(sellOffice) sellOffice.on('square200', function () { console.log('square200') }) sellOffice.on('square200', function () { console.log("square200 2") }) sellOffice.fire('square200') sellOffice.remove('square200') sellOffice.fire('square200')
这里其中关键的一点就是利用对象键值对存储了事件,在某个事件调用存储的事件,移除事件也是经过对对象从新赋值。这里使用对象做为存储的数据格式是由于经过键查询的复杂度是1,能够快速搜索到某个键存储的函数列表。函数