-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathEventCenter.js
48 lines (45 loc) · 1.06 KB
/
EventCenter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 实现发布-订阅模式
class EventCenter {
// 1.定义事件容器,用来装事件数组
handlers = {}
// 2.添加事件方法,参数
addEventListener(type, handler) {
// 创建新数组容器
if(!this.handlers[type]) {
this.handlers[type] = []
}
// 存入事件
this.handlers[type].push(handler)
}
// 3.触发事件,参数
dispatchEvent(type, params) {
// 若没有注册该事件则抛出错误
if(!this.handlers[type]) {
return new Error('该事件未注册')
}
// 触发事件
this.handlers[type].forEach(handler => {
handler(...params)
});
}
// 4.事件移除
removeEventListener(type, handler) {
if(!this.handlers[type]) {
return new Error('事件无效')
}
if(!handler) {
// 移除事件
delete this.handlers[type]
} else {
const index = this.handlers[type].findIndex(el => el === handler)
if(index === -1) {
return new Error('无该绑定事件')
}
// 移除事件
this.handlers[type].splice(index, 1)
if(this.handlers[type].length === 0) {
delete this.handlers[type]
}
}
}
}