long long ago,有这么一个事件库
论如何优雅地给祖传代码拍个 eventable() 就能用
💥 传统继承の痛,谁懂啊?
当你想给一个 已经有 3 层继承的祖传 Class 加事件系统:
class 祖传 Class extends 爷爷 Class { /* ... */ }
// 传统方案:硬着头皮再继承一层
class 我的 Class extends 祖传 Class, EventEmitter { /* 多重继承?不存在的!直接报错! */ }
痛点暴击:
- 🔨 破坏现有继承链
- 🚫 无法注入到第三方库的 Class
- 💣 污染原型链,所有实例都带上用不到的方法
✨ 事件系统的神之右手:eventable()
现在只需一行魔法:
import { eventable } from 'events-ex';
class 祖传 Java 风 Class extends 爷爷 Class { /* ... */ } // 保持原样
// 注入事件能力,但只注入(暴露) on/emit 方法(深藏功与名)
eventable(祖传 Java 风 Class, {
include: ['on', 'emit'] // 像做外科手术一样精准
});
// 用法和 EventEmitter 一毛一样
const obj = new 祖传 Java 风 Class();
obj.on('data', handleData);
obj.emit('data', payload);
核心理念:
- 🔌 非侵入式改造:不动原始类结构
- 🎯 精准控制:按需暴露方法(比如屏蔽掉敏感的 off())
- 🧩 兼容各种妖孽类:包括用 function 写的上古代码
🤯 高级玩法:给方法加事件钩子
更骚的是连方法都能挂事件:
class 数据库 {
connect() {
// 原始方法保持纯洁
console.log('建立连接');
}
}
// 给 connect 方法加前置事件
eventable(数据库, {
methods: {
connect() {
this.emit('pre-connect'); // 触发事件
this.super(); // 调用原方法( this.super 是魔法关键字!)
}
}
});
// 监听数据库连接事件
const db = new 数据库();
db.on('pre-connect', () => {
console.log('我要开始连接了,各组件注意!');
});
db.connect()
输出结果:
我要开始连接了,各组件注意!
建立连接
🛠 防翻车指南
- 保留原始方法:通过 this.super() 调用原逻辑
- 安全隔离:用 exclude: ['off'] 防止别人乱删监听器
- 类型守护:配套的 TypeScript 类型扩展已就位
灵魂发问:
你们项目里有那种 不敢动又必须增强 的类吗?快来试试这套无痛事件注入方案!
传送门:
👉 GitHub 地址 | 📚 完整 API 文档
投喂姿势:
npm install events-ex
讨论点:
- 你们会在什么场景下用这种非继承方案?
- 如果让你设计能力注入系统,会考虑哪些安全机制?