【问题标题】:Event emitter constructor事件发射器构造函数
【发布时间】:2015-12-13 15:47:55
【问题描述】:

我试图了解对象如何成为事件发射器。该文档有类似于以下代码的内容:

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

function Job(){
  EventEmitter.call(this);
}

不清楚call函数在这里做什么,显然是调用EventEmitter的构造函数?

> var j = new Job()
undefined
> j.emit('test')
TypeError: Object #<Job> has no method 'emit'

通过Job.prototype = new EventEmitter; 设置原型后似乎可以按预期工作。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

不清楚call函数在这里做什么,显然是调用EventEmitter的构造函数?

是的,它基本上是一个初始化发射器实例的super 调用。另请参阅 What is the difference between these two constructor patterns? 了解它的作用。

设置原型后,它似乎按预期工作。

确实,您需要让您的Jobs 继承自EventEmitter。不过,你真的should not use new here,而是

Job.prototype = Object.create(EventEmitter.prototype);

也可以看看Node.js - inheriting from EventEmitter

【讨论】:

  • 我认为按照我的回答做的更正确、更标准。只是我的 2ct
  • @DevAlien:更多更正确?不是真的 - 这是util.inherits 在内部所做的。我承认它可能是更“节点”的继承方式,而 Object.create 只是惯用的纯 JavaScript。
【解决方案2】:

这对我有用

let events = require('events');
let eventEmitter = new events.EventEmitter();

【讨论】:

    【解决方案3】:

    使用 ES6(我使用 babel,尽管对于最新 Node 的大多数功能来说这不是必需的),您可以这样做:

    import {EventEmitter} from 'events';
    
    export class Job extends EventEmitter {
      constructor() {
        super();
      }
    }
    
    let job = new Job();
    

    【讨论】:

    • @JasonLiveasay 从“事件”导入 {EventEmitter} 有什么不同;并来自@angular/core'
    • @Roxy'Pro 他们询问的是 Node.js(服务器端),而不是 Angular(客户端)。此外,这是四年前的事了——不确定它是否仍然是与 Node.js 相关的最佳答案。但是您会想尝试找到特定于您正在使用的 Angular JS 版本的答案。
    【解决方案4】:

    在 Job 定义下,您可以从 EventEmitter 继承如下

    util.inherits(Job, EventEmitter);
    

    Job 将成为您想要的事件发射器。这是“扩展”“对象”的好方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多