在 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();
我正在学习 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();