event

by imys

JavaScript

function Bus() {}
Bus.prototype = {
	constructor: Bus,
  events: {},
  on: function(name, fn) {
  	this.events[name] = this.events[name] || []
  	this.events[name].push(fn)
  },
  off: function(name, fn) {
  	if(!fn) {
    	delete this.events[name]
      return
    }
    this.events[name] = this.events[name].filter(item => item !== fn)
  },
  emit: function() {
  	var _this = this;
    var name = [].shift.call(arguments, 1)
    var args = arguments
    var events = this.events[name]
    if(!events) {
    	console.warn(name, '未注册')
      return
    }
    events.forEach(function(fn){
      fn.apply(_this, args)
    })
  }
}

const bus = new Bus()

const one = () => console.log(1, 'one')
bus.on('one', one) 
bus.on('one', str => console.log(2, str)) 

bus.emit('one', '11111')
// 1 "one"
// 2 "11111"

bus.off('one', one)

bus.emit('one', '22222')  // 2 "22222"

bus.off('one')

bus.emit('one', '33333') // one 未注册