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

时间:2018-02-14 23:07:16

标签: node-modules

为什么我必须先分配导出的构造函数,然后才能使用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')公开了构造函数。那么为什么我不能“直接”使用它呢?

1 个答案:

答案 0 :(得分:0)

我认为这是因为你在构造函数之后省略了括号。内部发生的是节点认为在require()调用之后添加括号 - 至少这是它的样子:

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

现在,让我们用括号写下来:

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

这也不起作用,因为在这种情况下,节点首先尝试评估require('rss')(),然后执行new,因为所有内容都是从右到左进行评估。

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

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