EventEmitter
class eventEmitter {
constructor() {
this._events = Object.create(null);
}
on(event, fn, context = this, checkDuplicated = true) {
if (!this._events[event]) {
this._events[event] = [];
}
const events = this._events[event];
const isDuplicated =
checkDuplicated &&
events.some(([evtFn, evtCtx]) => {
return fn === evtFn && context === evtCtx;
});
if (!isDuplicated) {
events.push([fn, context]);
}
return this;
}
once(event, fn, context = this) {
const newFn = () => {
this.off(event, newFn);
fn.apply(context, arguments);
};
// 挂载原始的 fn,方便通过 $off 删除
newFn.fn = fn;
this.on(event, newFn, context, false);
return this;
}
off(event, fn) {
if (!arguments.length) {
this._events = Object.create(null);
return this;
}
const events = this._events[event];
if (!events) {
return this;
}
if (!fn) {
this._events[event] = null;
return this;
}
let i = events.length;
while (i--) {
let event = events[i];
if (event[0] === fn || event[0].fn === fn) {
events.splice(i, 1);
}
}
return this;
}
emit(event, ...arg) {
const cbs = this._events[event];
if (cbs) {
cbs.forEach(([fn, context], idx) => {
fn.apply(context, arg);
});
}
}
}
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65