【问题标题】:Extending Node's EventEmitter in ES5在 ES5 中扩展 Node 的 EventEmitter
【发布时间】:2020-02-13 10:27:32
【问题描述】:

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

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

this.emit('messageRead', message);

TypeError: this.emit 不是函数

我做错了什么?

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();

【问题讨论】:

    标签: node.js prototype ecmascript-5 eventemitter


    【解决方案1】:

    必须从 EventEmitter 继承,不能只在 MyEmitter 实例范围内运行构造函数

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

    【讨论】:

      【解决方案2】:

      我的代码的问题在于 this 和闭包。请参阅下面更新的 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();
      

      【讨论】:

        猜你喜欢
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 2022-01-25
        • 2021-08-18
        • 2021-12-14
        • 2018-06-29
        • 1970-01-01
        相关资源
        最近更新 更多