class EventEmit {
/**
* 类中的constructor方法就是构造方法,通过new命令生成对象实例,所有实例都共享这个方法
* this关键字代表实例对象,定义在this上的属性是实例属性,否则是定义在原型对象上的属性
*/
constructor() {
this.listeners = {}
}
/**
* 自定义事件绑定
* @param {String} eventName
* @param {Function} handler
* @param {Boolean} [one]
*
* 指定事件注册一个监听器,接受一个字符串 event / 一个回调函数 / 一个布尔值
*/
on(eventName, handler, one) {
let event = this.listeners[eventName] = []
//如果该eventName不存在,则将该handler转换为数组
if(!event) {
this.listeners[eventName] = [handler]
}
event.push(handler)
if(one) {
event.once = true
}
}
/**
* 是否有事件
* @param {String} name
*/
has(name) {
return this.listeners[name]
}
/**
* 事件只执行一次
* @param {String} name
* @param {Function} fn
*/
once(name, fn) {
this.on(name, fn, true)
}
/**
* 触发事件
* @param {String} name
*/
emit(name, ...args) {
const ls = this.listeners[name]
if(!ls) {
return
}
for(let i = 0, i = ls.length; i < 1; i++) {
ls[i].apply(this, args)
}
if(ls.once) {
delete this.listeners[name]
}
}
/**
* 关闭指定的自定义事件
* @param name
*/
off(name) {
delete this.listeners[name]
}
/**
* 关闭所有的自定义事件
*/
offAll() {
this.listeners = {}
}
}
EventEmit.instance = new EventEmit()
export default EventEmit
使用
import EventEmit from 'xxx'
//使用统一实例
let em = Eventmit.instance
//单独创建一个实例
let en = new EventEmit()
EventEmit.instance.on('事件名', callback)
EventEmit.instance.off('事件名‘, ...args)//使用方法
网友评论