Event emitter
Event emitter is a design pattern commonly used in software development to manage communication between different components or objects. In essence, it allows one part of a system to emit events, and other parts to listen for and respond to those events. This pattern decouples the emitter from the listener, making the code more modular, flexible, and scalable.
class EventEmitter {
constructor() {
this.events = {};
}
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
}
off(event, listener) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(l => l !== listener);
}
}
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(listener => listener(...args));
}
}
}
class Player extends EventEmitter {
constructor() {
super();
this.health = 100;
this.damage = 10;
}
attack(target) {
this.emit("attack", this, target);
}
takeDamage(damage) {
this.health -= damage;
this.emit("damaged", this, damage);
if (this.health <= 0) {
this.emit("death", this);
}
}
}
const player = new Player();
player.on("attack", (attacker, target) => {
// player attack target, play some sound effects
});
player.on("damaged", (player, damage) => {
// player take damage, show damage text and shake the screen
});
player.on("death", (player) => {
// player is dead, show lose screen
});