SOURCE

class EventEmitter {
  
  constructor() {
    this.events = {};
  }
  
  on(event, cb) {
    if(!this.events[event]) {
      this.events[event] = [];
    }
    
    if (this.events[event].indexOf(cb) === -1) {
    	this.events[event].push(cb);
    }
    
    return this;
  }
  
  off(event, cb) {
    if(!this.events[event]) {
      return this;
    }
    
    if(!cb) {
      this.events[event] = [];
    }
    
    let index = this.events[event].indexOf(event);
    if(index > -1) {
      this.events[event].splice(index, 1);
    }
    
    return this;
  }
  
  once(event, cb) {
    var that = this;
    function only() {
      let args = Array.prototype.slice.call(arguments);
      cb.apply(null, args);
      this.off(event, only);
    }
    this.on(event, only);
    return this;
  }
  
  emit(event, ...args) {
    if(!this.events[event]) {
      return this;
    }
    
    this.events[event].forEach(fn => {
      fn.apply(null, args);
    });
    
    return this;
  }
  
}
console 命令行工具 X clear

                    
>
console