使用 Node 模块导出作为带有 new 运算符的构造函数

Use Node module export as constructor with new operator

为什么我必须先分配导出的构造函数,然后才能将其与 new 运算符一起使用以实例化对象类型?

例如(使用 npm 包 rss):

const feed1 = new require('rss'); // => errors out: this is undefined in constructor

const rss = require('rss'),
  feed2 = new rss; // => works fine

据我了解 Node 的模块系统,require('rss') 公开了构造函数。那么为什么我不能使用它 "directly"?

我认为发生这种情况是因为您在构造函数之后省略了括号。内部发生的是节点考虑在 require() 调用之后添加括号——至少它看起来是这样的:

const i = new require('rss') // results in an error

现在,让我们用括号代替:

const i = new require('rss')()

这也行不通,因为在这种情况下,节点会先尝试计算 require('rss')(),然后再执行 new,因为所有内容都是从右到左计算的。

现在让我们告诉节点不要执行 rss 导出,而是正确地创建一个实例:

const i = new (require('rss'))()