使用 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'))()
为什么我必须先分配导出的构造函数,然后才能将其与 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'))()