class EventEmitter {
eventList = [];
on(event, fn) {
(this.eventList[event] || (this.eventList[event] = [])).push(fn);
}
once(event, fn) {
function one() {
fn.apply(this, arguments);
this.off(event, one);
}
this.on(event, one);
}
emit(event, data) {
if (!this.eventList[event]) return false;
this.eventList[event].forEach((fn) => {
fn.call(this, data);
});
}
off(event, fn) {
if (!this.eventList[event]) return;
if (!fn) {
this.eventList[event] = [];
} else {
this.eventList[event] = this.eventList[event].filter((itm) => itm !== fn);
}
}
}
function user1(content) {
console.log("用户1订阅了:", content);
}
function user2(content) {
console.log("用户2订阅了:", content);
}
function user3(content) {
console.log("用户3订阅了:", content);
}
function user4(content) {
console.log("用户4订阅了:", content);
}
let eventEmitter = new EventEmitter();
eventEmitter.on("article1", user1);
eventEmitter.on("article1", user2);
eventEmitter.on("article1", user3);
eventEmitter.off("article1", user2);
eventEmitter.once("article2", user4);
eventEmitter.emit("article1", "Javascript 发布-订阅模式");
eventEmitter.emit("article1", "Javascript 发布-订阅模式");
eventEmitter.emit("article2", "Javascript 观察者模式");
eventEmitter.emit("article2", "Javascript 观察者模式");
eventEmitter.emit("article2", "Javascript 观察者模式");