1.场景
假设你要实现一个需求,后端告诉你金币变化了,你在界面上更新金币数量
那么可以有一个发送者,用于在接到后端金币的变化的通知时,发送【金币变化】的消息
还需要一个侦听者,监听【金币变化】的通知并作出处理
2.需要方法
- 用于注册监听函数的方法:addEventListener
- 用于触发监听的方法:dispatchEvent
- 用于移除监听的方法:removeEventListener
- 用于判断是否有监听的方法: hasEventListener
第1个版本代码
// 第一个版本代码
class EventDispatcher {
private $eventMap = {
};
/*
* 注册监听函数
*/
public addEventListener(type: string, listener: Function, thisObject: any): void {
this.$addListener(type, listener, thisObject);
}
private $addListener(type, listener, thisObject): void {
let eventMap = this.$eventMap;
let list = eventMap[type];
if (!list) {
list = eventMap[type] = [];
}
this.$insertEventBin(list, type, listener, thisObject);
}
private $insertEventBin(list: any[], type: string, listener: Function, thisObject: any): boolean {
let length = list.length;
// 判断函数是否已经监听过了,监听过了直接返回
for (let i = 0; i < length; i++) {
let bin = list[i];
if (bin.listener == listener && bin.thisObject == thisObject) {
return false;
}
}
let eventBin = {
type: type, listener: listener, thisObject: thisObject
}
list.push(eventBin);
}
/*
* 移除监听函数
*/
public removeEventListener(type: string, listener: Function, thisObject: any)