Node.js中如何为类添加自定义事件?附尝试代码及问题
如何在Node.js类中添加自定义事件
嘿,我来帮你搞定Node.js类里自定义事件的问题!先看看你代码里的两个关键小问题,再给你修正后的完整实现:
你的代码里的问题
- 继承EventEmitter的方式不对:在ES6类里,不能用
events.EventEmitter.call(this)这种旧的构造函数继承写法,得用extends关键字让Farm类直接继承EventEmitter,这样才能正确拿到事件发射和监听的能力。 - 事件回调绑定错了:你写的
testFarm.on("totalChanged",testFarm.toString())会立刻执行toString(),把返回的字符串当成回调函数传进去——这肯定不是你要的效果,得传一个函数,等事件触发时再执行它。
修正后的完整代码
const events = require('events'); // 用extends继承EventEmitter,这是ES6类正确的继承姿势 class Farm extends events.EventEmitter { constructor(totalAnimals) { super(); // 必须调用super()初始化父类构造函数,不然会报错 this._totalAnimals = totalAnimals; } get totalAnimals() { return this._totalAnimals; } set totalAnimals(newTotal) { this._totalAnimals = newTotal; // 加个emit,这样直接修改totalAnimals属性时也能触发事件 this.emit("totalChanged"); } sellAnimals(amount) { this._totalAnimals -= amount; this.emit("totalChanged"); } buyAnimals(amount) { this._totalAnimals += amount; this.emit("totalChanged"); } toString() { return `Number of animals in farm: ${this._totalAnimals}`; } } // 测试环节 const testFarm = new Farm(100); // 传入箭头函数当回调,事件触发时才会执行toString并打印结果 testFarm.on("totalChanged", () => { console.log(testFarm.toString()); }); testFarm.buyAnimals(20); // 会输出:Number of animals in farm: 120 testFarm.sellAnimals(50); // 会输出:Number of animals in farm: 70 // 直接修改属性也能触发事件啦 testFarm.totalAnimals = 200; // 会输出:Number of animals in farm: 200
额外小提示
- 用
extends继承后,你的Farm实例自动就有了on、emit、once这些EventEmitter的方法,不用再手动去调用父类构造函数啦(不过自己的构造函数里一定要记得写super())。 - 如果想让直接修改
totalAnimals属性时也触发事件,就在setter里加上emit,我已经帮你加上这个逻辑了。 - 要是担心回调里的
this指向问题,除了箭头函数,也可以用testFarm.toString.bind(testFarm)作为回调,这样toString里的this就会稳稳指向testFarm实例啦。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

