【问题标题】:How handle multiple objects with EventEmitter - NodeJS如何使用 EventEmitter 处理多个对象 - NodeJS
【发布时间】:2015-12-22 20:03:56
【问题描述】:

主文件

var DogModule = require('Dog');
var dogsList = [];

function addNewDog(){
  var newDog = new Dog();
  dogsList.push(newDog);
}

???.on('bark', function(barkSound) {
    console.log(barkSound);
});

狗档案

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

function Dog() {

    EventEmitter.call(this);

    this.name = "asda";
    this.chipId = 1234;

    this.emit('bark', "au-au");
}

Dog.prototype = {

   getName: function () {
     return this.name;
   },

   getChipId: function () {
     return this.chipId;
   }
}

问题 1 - 我怎样才能正确地将 EventEmitter.prototype 添加到 Dog 对象并保存当前原型,并且基本上只能访问 EventEmitter 方法?

  • Dog.prototype = Object.create(EventEmitter.prototype);
  • 使用 util 模块,然后使用 util.inherits(Dog, EventEmitter);

这里的问题是如何不覆盖现有的方法...


问题 2 - 处理一个对象没问题,但对于多个对象,我如何处理它们的个性,知道它们将存储在该列表中?

谢谢。

【问题讨论】:

  • 对于继承,请遵循关于扩展 EventEmitter 的标准 Node 文档:nodejs.org/api/events.html#events_inheriting_from_eventemitter
  • 正如我上面所说的问题是使用 util.inherits(Dog, EventEmitter) (如文档中所述)覆盖对象原型的现有方法。
  • 您首先放置 `util.inherits(Dog, EventEmitter)`,然后像 Dog.prototype.getName = function() {} 一样单独添加每个方法,这样就不会覆盖之前的原型。这样做Dog.prototype = {...} 会覆盖之前的Dog.prototype,所以不要这样做。
  • Tbh 我知道,但是当对象有大约 100 个方法时,重新格式化整个原型有点痛苦。这就是为什么我问希望有一个更有效的解决方案。
  • 您可以将一个充满方法的对象与原型合并。

标签: javascript node.js events event-handling eventemitter


【解决方案1】:

为防止重写原型,可以使用Object.assign

util.inherits(Dog, EventEmitter);
Dog.prototype = Object.assign({
  getName: function () {
    return this.name;
  },
  getChipId: function () {
    return this.chipId;
  }
}, Dog.prototype);

【讨论】:

  • 很棒的发现,它是 ES6 新特性的一部分!顺便说一句,关于问题 2 的任何想法?首先是更多的好奇心:p
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多