function Event () {
this._maxListeners = 10;
this._events = Object.create(null);
}
Event.prototype.addListener = function (event, callback) {
if (!this._events) {
this._events = Object.create(null);
}
if (!this._events[event]) {
this._events[event] = [callback];
} else if (this._events[event].length < this._maxListeners) {
this._events[event].push(callback);
}
}
Event.prototype.removeListener = function (event, callback) {
if (Array.isArray(this._events[event])) {
if (!callback) {
delete this._events[event];
}else {
this._events[event] = this._events[event].filter(cb => cb !== callback && cb.origin !== callback);
}
}
}
Event.prototype.emit = function (event, ...args) {
let callbacks = this._events[event];
if (Array.isArray(callbacks)) {
callbacks.forEach((cb) => {
cb.apply(this, args);
})
}
}
Event.prototype.once = function (event, callback) {
const only = function (...args) {
callback.apply(this, args);
this.removeListener(event, callback);
}
only.origin = callback;
this.addListener(event, only);
}
Event.prototype.setMaxCallbackNum = function (num) {
this._maxListeners = num;
}
var events = new Event();
var listener1 = function listener1 () {
console.log('这是监听器1');
}
var listener2 = function listener2 () {
console.log('这是监听器2');
}
events.addListener('connection', listener1);
events.once('connection', listener2);
events.emit('connection');
events.removeListener('connection', listener1);
events.emit('connection');