代码之家  ›  专栏  ›  技术社区  ›  Thorsten

将节点模块导出用作新运算符的构造函数

  •  1
  • Thorsten  · 技术社区  · 8 年前

    为什么必须先分配导出的构造函数,然后才能将其用于 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 回复  |  直到 8 年前
        1
  •  0
  •   Luca Steeb    8 年前

    我认为发生这种情况是因为在构造函数后去掉了括号。内部情况是,节点考虑在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'))()