【问题标题】:nodejs events - EventEmitter - understanding class instancesnodejs 事件 - EventEmitter - 理解类实例
【发布时间】:2016-06-24 05:26:13
【问题描述】:

我正在实例化一个事件发射器,并注意到这两行似乎都可以正常工作。

谁能澄清这两种导入和实例化 EventEmitter 类的方法之间的权衡或区别?

1:var eventEmitter = new (require('events')).EventEmitter();

2:var eventEmitter = new (require('events').EventEmitter)();

我的看法:

在 1 中,(require('events')) 应该返回 events 模块的导出。然后.EventEmitter() 引用该类并new 创建EventEmitter 的新实例。

在2中,(require('events').EventEmitter) should return the exported EventEmitter class. Thennew...()creates a new instance ofEventEmitter`。

【问题讨论】:

  • 假设您使用的是最新的节点 LTS 或 0.12 之后的版本 - 那么您的 '.EventEmitter' 部分已被弃用,而不再需要。所以你可以这样做: var evntEmitter = new (require('events'))();

标签: javascript node.js class eventemitter


【解决方案1】:

这没什么不寻常的。您可以在函数周围放置任意数量的括号,然后在其后面加上 (),这样就可以正常工作了。

类似

(1 + 2) === 3;
((1) + 2) === 3;
((1 + (2))) === (3);

等等...同样适用于对象/函数。

class MyClass { /* ... */ }

const object = {
    c: MyClass,
};
let a = new object.c();

console.log(a === new (object).c());
console.log(a === new ((object.c))());
console.log(a === new ((object).c)());

等等……

值得注意的是不能在点. 后面加上括号,例如:

let a = new object.(c)();

会抛出错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2017-05-10
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多