思路
1.一个on方法用来收集订阅的事件和事件对用的名称;名称用来发布时候触发事件
一个名称可以对应多个事件,一个事件可以对应多个名称;
2. 一个off 方法来去掉on 方法收集的事件;
3.emit 发布on 收集的事件
下面上代码(可复制直接运行试试输出)
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
</head>
<body>
<script type="text/javascript">
class EventEmitter {
constructor(){
this.events = {};
}// 补全代码
on(event,fn){
if(Array.isArray(event)){
for(let i = 0; i < event.length; i++ ) {
this.on(event[i],fn);
}
}else {
(this.events[event] || (this.events[event] = [])).push(fn);
}
return this;
}
off(event,fn){
if(!event){
this.events = object.create(null);
return this
}
if(Array.isArray(event)){
for (let index = 0; index < event.length; index++) {
const element = event[index];
this.off(element,fn);
}
return this;
}else {
if(!fn){
this.events[event] = [];
return this;
}
const eventsList = this.events[event];
for (let index = eventsList.length - 1; index >= 0; index--) {
const element = eventsList[index];
if(fn === element ){
eventsList.splice(index,1);
}
}
}
}
emit(event){
if(!this.events[event]) return this;
const arg = Array.from(arguments).slice(1);
for(let i = 0; i < this.events[event].length;i++){
this.events[event][i](...arg);
}
}
}
(function (){
let sign1 = 0;
let sign2 = 0;
const emitter = new EventEmitter();
var fun1 = function() {sign1 ++};
var fun2 = function() {sign2 ++};
emitter.on('add',fun1 );
emitter.on('add',fun2);
emitter.off('add',fun1);
emitter.emit('add');
// emitter.emit('add');
const judge = sign1 === 0 && sign2 === 1;
console.log(judge,sign1,sign2,8)
})();
</script>
</body>
</html>