【问题标题】:Node.JS: Event EmmiterNode.JS:事件发射器
【发布时间】:2016-06-28 23:29:46
【问题描述】:
function Auth() {
  console.log('Created!')
}
Auth.prototype.authenticate = function () {
  // do stuff
  this.emit('completed')
}
util.inherits(Auth, EventEmitter)

如何在其他函数中调用 Auth.emit('someEvent')?例如:

function someOther () {
  //do stuff
  Auth.emit('event')
}

它会抛出一个错误:

Auth.emit 不是函数

【问题讨论】:

  • 你需要先创建一个Auth的实例。或者不使用原型函数。
  • @zerkms ,好的,但它是模块(我让用户在需要模块时创建它的新实例),所以我可以将这个 someOther 函数移动到类中。但是,我需要在创建该类的新实例之前调用函数。我怎样才能做到这一点?有可能吗?
  • 嗯,没有实例是不可能调用实例方法的。你需要重新考虑你需要做什么以及如何做。
  • @zerkms,有什么想法(pastebin.com/V84MH4cR)?
  • 当然:如果没有实例,就不要调用实例方法。

标签: javascript node.js inheritance eventemitter


【解决方案1】:

你需要创建一个实例。

var myAuthObj = new Auth();
myAuthObj.authenticate(...);

原型上的方法是“实例”方法。它们可以直接在对象的实例上调用。

您也可以创建“静态”方法(以不同的方式,实际上只是分配给命名空间对象的普通函数),但它们不能使用 this 或您继承的对象,因为这些方法只有在您实例化时才会到位带有new 和您的构造函数的实际对象。

您还需要将您的util.inherits() 移到原型作业的前面。 util.inherits() 语句替换了原型,所以如果你之后这样做,你就会清除你刚刚分配给原型的东西。而且,您也应该调用父对象的构造函数。

function Auth() {
  EventEmitter.call(this);
  console.log('Created!')
}

util.inherits(Auth, EventEmitter);

Auth.prototype.authenticate = function () {
  // do stuff
  this.emit('completed')
}

所以,要解决三件事:

  1. 在将任何内容分配给 Auth.prototype 之前移动 util.inherits()
  2. EventEmitter.call(this) 添加到您的构造函数以正确初始化基础对象
  3. 使用new Auth() 构造您的 Auth 对象的实例并调用该实例上的方法。

【讨论】:

  • 他还需要将util.inherits 调用放在Auth.prototype.authenticate 的分配前面。
  • @Bergi - 好收获。也加入了这一点。
  • 当我们这样做的时候:It's not strictly necessary 但肯定是调用超级构造函数的最佳实践:-)
  • 谢谢回复,可以看看我的模块代码吗? (pastebin.com/V84MH4cR) 我知道我需要创建一个实例,但是在我的模块中最好的方法是什么(我之所以问是因为 module.export 实际上是在导出新创建的实例)
  • @Src - 你没有透露任何试图使用你的 Auth 对象的代码的上下文,所以我不知道你还在问什么。我们已经解释过,您需要一个实例才能使用它。您的模块显示导出一个很好的实例,但您没有修复util.inherits() 问题或我在回答中指出的基本构造函数问题。请阅读我的回答并修复其中提到的所有三件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多