在 ES5 中扩展 Node 的 EventEmitter

Extending Node's EventEmitter in ES5

我正在学习 JavaScript/Nodejs,我决定先从 ES5 开始,然后再研究 ES6。我正在研究原型继承和 EventEmitter。

我想用一些简单的东西扩展 EventEmitter,我的代码示例如下。但是我收到错误:

this.emit('messageRead', message);

TypeError: this.emit is not a function

我做错了什么?

var EventEmitter = require('events').EventEmitter;

var MyEmitter = function() {
    EventEmitter.call(this);
    this.messages = []
}

MyEmitter.prototype = Object.create(EventEmitter.prototype);
MyEmitter.prototype.constructor = MyEmitter;
MyEmitter.prototype.addMessage = function(message) {
    this.messages.push(message)
    this.emit('messageAdded', message);
    return this;
}
MyEmitter.prototype.readMessages = function() {
    this.messages.forEach(function(message){
        this.emit('messageRead', message);
    });
    return this;
}

var emitter1 = new MyEmitter();
emitter1
    .addMessage('hello')
    .addMessage('goodbye')
    .on('messageAdded', function(message) { console.log('message added: ' + message)})
    .on('messageRead', function(message) { console.log('message read: ' + message)})
    .readMessages();

您必须从 EventEmitter 继承,而不仅仅是 运行 MyEmitter 实例范围中的构造函数

const util = require('util');
...
util.inherits(MyEmitter, EventEmitter);

我的代码的问题在于这个和闭包。请参阅下面更新的 readMessages。

但感谢@Yarsolav,他可能指出了更好的解决方案。

var EventEmitter = require('events').EventEmitter;

var MyEmitter = function() {
    EventEmitter.call(this);
    this.messages = []
}

MyEmitter.prototype = Object.create(EventEmitter.prototype);
MyEmitter.prototype.constructor = MyEmitter;
MyEmitter.prototype.addMessage = function(message) {
    this.messages.push(message)
    this.emit('messageAdded', message);
    return this;
}
MyEmitter.prototype.readMessages = function() {
    var that = this;
    this.messages.forEach(function(message){
        that.emit('messageRead', message);
    });
    return this;
}

var emitter1 = new MyEmitter();
emitter1
    .on('messageAdded', function(message) { console.log('message added: ' + message)})
    .on('messageRead', function(message) { console.log('message read: ' + message)})
    .addMessage('hello')
    .addMessage('goodbye')
    .readMessages();