require()和new require()之间有什么区别?

Men*_*hak 3 javascript require node.js

我的问题的核心是,有什么区别

var fs = new require('fs');
Run Code Online (Sandbox Code Playgroud)

和

var fs = require('fs');
Run Code Online (Sandbox Code Playgroud)

如果我new到处都使用所有模块,是否有任何影响或警告?

在使用Webstorm的时候,我注意到只有在我使用的时候才可以使用intellisense new require('fs').在我开始一直使用它以获得更好的开发体验之前,我想了解更多相关信息.

aps*_*ers 6

首先:不要混淆new require("...")(它调用require的构造函数)与new (require("..."))(其中调用的返回值的的require呼叫作为构造函数).你正在做第一个.

require不打算作为构造函数调用new.那不是Node-idiomatic,而且通常很奇怪.您不应该这样做,因为它会降低代码的可读性.未来的读者可能很容易误以为是new (require("..."))(即呼吁new对正在构造的返回 require),因为通常节点风格不使用new带require.

现在,我们来谈谈实际的副作用.

new导致函数运行其[[Construct]]内部方法,该方法采取以下操作:

  • 使用thisset 调用函数,将其原型设置为函数prototype属性的新创建的对象

  • 返回结果:

    • 如果函数返回一个对象,则返回该函数的结果
    • 如果函数返回任何其他内容,则返回新创建的this对象

返回值new require将require与其exports值非原始的所有模块相同(几乎任何模块都是如此;它们通常导出普通对象或函数,它也是一种对象).但是,在极少数情况下,模块会导出基元,然后new会拒绝您访问该值.

require(...)和之间唯一的另一个可能的区别new require(...)是new变量提供了不同的this值.但是,require似乎this完全忽略了它的价值.(注意Module.prototype.require- 与普通函数不同require- 确实使用了它的this值,但只有在需要模块的子模块时才使用它module.require(...).)