function EventEmitter() { this.listeners = {}; this.maxListener = 2; } EventEmitter.prototype.on = function (event, cb) { var listeners = this.listeners; // debugger; if (listeners[event] && listeners[event].length >= this.maxListener) { throw console.error(‘监听器的最大数量是%d,您已超出限制‘, this.maxListener) } if (listeners[event] instanceof Array) { if (listeners[event].indexOf(cb) === -1) { listeners[event].push(cb); } } else { listeners[event] = [].concat(cb); } } EventEmitter.prototype.addListener = EventEmitter.prototype.on; EventEmitter.prototype.emit = function (event) { var args = Array.prototype.slice.call(arguments); args.shift(); this.listeners[event].forEach(cb => { cb.apply(null, args); }); } EventEmitter.prototype.listeners = function (event) { return this.listeners[event]; } EventEmitter.prototype.setMaxListeners = function (num) { this.maxListener = num; } EventEmitter.prototype.removeListener = function (event, listener) { var listeners = this.listeners; var arr = listeners[event] || []; var i = arr.indexOf(listener); if (i >= 0) { listeners[event].splice(i, 1); } } EventEmitter.prototype.removeAllListener = function (event) { this.listeners[event] = []; } EventEmitter.prototype.once = function (event, listener) { var self = this; function fn() { var args = Array.prototype.slice.call(arguments); listener.apply(null, args); self.removeListener(event, fn); } this.on(event, fn) }
原文:https://www.cnblogs.com/cenfengtao/p/15060418.html