/*请完成下面这个函数,实现题目要求的功能
******************************开始写代码******************************/
function EventEmitter() {
// 事件仓库
this.clientList = {}
// 订阅事件
this.on = function (name, fn) {
if (this.clientList[name] === undefined) {
this.clientList[name] = {
multiTimes: [],
onlyOnce: []
}
this.clientList[name].multiTimes.push(fn)
} else {
this.clientList[name].multiTimes.push(fn)
}
}
// 一次性订阅事件
this.once = function (name, fn) {
if (this.clientList[name] === undefined) {
this.clientList[name] = {
multiTimes: [],
onlyOnce: []
}
this.clientList[name].onlyOnce.push(fn)
} else {
this.clientList[name].onlyOnce.push(fn)
}
}
// 发布事件
this.emit = function (name) {
var argumentsArray = Array.prototype.slice.call(arguments)
argumentsArray.splice(0, 1)
if (this.clientList[name] !== undefined) {
var multimesHandler = this.clientList[name].multiTimes
var onlyOnceHandler = this.clientList[name].onlyOnce
for (var i = 0; i < multimesHandler.length; i++) {
multimesHandler[i].apply(null, argumentsArray)
}
for (var j = 0; j < onlyOnceHandler.length; j++) {
onlyOnceHandler[j].apply(null, argumentsArray)
}
this.clientList[name].onlyOnce.length = []
} else {
}
}
// 移除事件
this.remove = function (name, fn) {
var indexMultiTimes = this.clientList[name].multiTimes.indexOf(fn)
var indexOnlyOnce = this.clientList[name].onlyOnce.indexOf(fn)
this.clientList[name].multiTimes.splice(indexMultiTimes, 1)
this.clientList[name].onlyOnce.splice(indexOnlyOnce, 1)
}
}
// 新建一个emitter对象
var e = new EventEmitter()
var count = 0
e.on('test', function (num1, num2) {
count = num1 + num2
})
e.emit('test', 1, 2)