leohxj
1/31/2018 - 3:18 AM

Events

Events

class MyEvents {
	constructor () {
		this.events = {} //存储事件监听函数
		this.maxListeners = 10 //一种函数类型,最大监听函数数量
	}
	
	setMaxListeners (maxNum) {
		this.maxListeners = maxNum
	}
	
	getMaxListeners () {
		return this.maxListeners
	}
	
	listeners (event) {
		return this.events[event]
	}
	
	addListener (type, listener) {
		if (this.events[type]) {
			if (this.maxListeners != 0 && this.events[type].length > this.maxListeners) {
				return console.error(`该${type}事件类型的listteners超出限制,使用emitter.setMaxListeners() 来增加添加事件监听数量。`)
			}
			this.events[type].push(listener)
		} else {
			this.events[type] = [listener]
		}
	}
	
	once (type, listener) {
		//执行后立即销毁
		let wrapper = (...rest) => {
			listener.apply(this, rest)
			this.removeListener(type, wrapper)
		}
		this.addListener(type, wrapper)
	}
	
	removeListener (type, listener) {
		if (this.events[type]) {
			this.events[type] = this.events[type].filter(ev => {
				ev != listener
			})
			//抛弃掉等于listener的
		}
	}
	
	removeAllListener (type) {
		delete this.events[type]
	}
	
	emit (type, ...rest) {
		this.events[type] && this.events[type].forEach(listener => {
			listener.apply(this, rest)
		})
	}
}

MyEvents.prototype.on = MyEvents.prototype.addListener
module.exports =  MyEvents

作者:happyGloria
链接:https://juejin.im/post/5a6ebc056fb9a01ca072172b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。