惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
U
Unit 42
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
I
InfoQ
WordPress大学
WordPress大学
H
Help Net Security
D
Docker
B
Blog
腾讯CDC
A
About on SuperTechFans
Recent Announcements
Recent Announcements
雷峰网
雷峰网
有赞技术团队
有赞技术团队
C
Check Point Blog
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

Node.js

有深度使用 bunjs 的佬吗, rust 重写的 1.4 版本内存泄露解决了吗? - V2EX 告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染 Bun 用 Rust 重写的 PR 已合并到主分支 TanStack 最新版本被投毒,病毒会盗密钥和报复性删除用户目录 Bun 从 Zig 到 Rust 的迁移已经实锤,下个版本可能成为最后一个 Zig 版本 bun 要从 zig 迁移 rust 了, 100 万刀被 claude 收购了,开始影响语言决策了 JS/Node 已经是新时代的 Java 了吧 Node.js 服务大部分时候连阿里云 Redis 是正常的,但是又时候会突然报 read ECONNRESET? 2026 年, node 写后端你用的 nestjs, fastify, honojs 还是其他? npmmirror 竟然有些包没有更新到最新版本 大家 typescript 下用的最多的是后端框架是哪个? 求助,大家 node.js 是怎么代理的 ai 时代, node.js 成为核心语言 NestJS + Swagger UI:非 200 状态码 Execute 时返回值不显示问题 深入 alova3 服务端能力:分布式 BFF 层到 API 网关的最佳实践 Anthropic 收购 Bun 关于 Node.js 中的事件循环问题。 Hoa - 一个极简 Web 框架 有没有 v 友遇到 windows10 丢失系统环境变量的问题 Esbuild 进程占用高 有没有推荐的 Nodejs 的 sass 多租户系统 2025 年 node 项目,乱成一锅粥的 typescript ESM import 写法该怎么选? [EvanNav 6.3.1] 如何删除加载页面,让 Nav 更符合你的需求⁉️ 删除 node_modules 文件夹非常耗时 Node.JS 作者 Ryan Dahl 的故事 Vona ORM 文档终于肝完了,欢迎拍砖 Node.js 官网更新了 adonisjs 有没有现成的注册登录库? 现在流行的 Node.js 做后台比传统的 Java .Net 有哪些优势? 现在大家开发 api 都用什么 node 框架?有没有想 rails 一样,功能齐全的框架?
不用继承就能给类加事件系统?这波原型链操作我给满分
riceball · 2025-06-09 · via Node.js

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

讨论点:

  • 你们会在什么场景下用这种非继承方案?
  • 如果让你设计能力注入系统,会考虑哪些安全机制?