I need to create this eventEmitter
class with the functions listed below. I think I could clean the code a little but don't really know where to start.
var eventEmitter =function (){
this.listeners = 0;
this.events = {};
return this;
};
eventEmitter.prototype.on = function(ev, cb) {
if (typeof ev !== 'string') throw new TypeError("Event should be type string", "index.js", 6);
if (typeof cb !== 'function' || cb === null || cb === undefined) throw new TypeError("callback should be type function", "index.js", 7);
if (this.events[ev]){
this.events[ev].push(cb);
} else {
this.events[ev] = [cb];
}
this.listeners ++;
return this;
};
eventEmitter.prototype.emit = function(eventType) {
if (typeof eventType !== 'string') throw new TypeError("Event type should be type string", "index.js", 6);
var handlerFunctions = this.events[eventType];
if (handlerFunctions) {
var self = this;
for (var i = 0; i < handlerFunctions.length; i++) {
var handler = handlerFunctions[i];
if (arguments.length > 0) {
var args = Array.prototype.slice.call(arguments).slice(1, arguments.length);
handler.apply(self, args);
} else{
handler.call(self);
}
}
}
return this;
};
eventEmitter.prototype.off = function(eventType, handlers) {
if ( arguments.length > 0 && (eventType === 'undefined' || typeof eventType !== 'string')) throw TypeError('listener must be a function');
if (arguments.length > 1) {
if ( typeof handlers !== 'function' || handlers === 'undefined') throw TypeError('handler must be a function string or object');
}
switch(arguments.length) {
case 0:
this.listeners = 0;
this.events = {};
break;
case 1:
if (this.events[eventType]) {
this.listeners = this.listeners - this.events[eventType].length;
delete this.events[eventType];
}
break;
case 2:
if (this.events[eventType]) {
for (var i = 0; i < this.events[eventType].length; i++) {
if (handlers.toString() == this.events[eventType][i].toString()){
this.events[eventType].splice( i, 1 );
this.listeners --;
i --;
}
}
}
break;
}
return this;
};
module.exports = eventEmitter;