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

时间:2013-12-26 15:18:39

标签: javascript node.js require

我的问题的核心是,

之间有什么区别
var fs = new require('fs');

var fs = require('fs');

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

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

3 个答案:

答案 0 :(得分:5)

首先:请勿将new require("...")(调用require作为构造函数)与new (require("..."))混淆(调用返回值<作为构造函数的require调用的/ em>。你正在做第一个。

require无意作为new的构造函数调用。那不是Node-idiomatic,而且通常很奇怪。您不应该这样做,因为它会降低代码的可读性。未来的读者可能很容易将其误认为new (require("..."))(即,在由 new 返回的构造函数上调用require,因为正常的Node样式不会将newrequire一起使用。

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

new会导致函数运行其[[Construct]] internal method,其执行以下操作:

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

  • 返回结果:

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

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

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

答案 1 :(得分:1)

Node.js中的'new'运算符用于创建某事物的新实例。正如您在Node.js中所知,函数本身就是第一类对象。您可以使用将驻留在变量中的“new”运算符来创建函数的新实例。

这用于创建具有相同主体但名称不同的许多函数,以便它们在程序中具有不同值的变量。

另一方面,要求用于导入您在其他地方创建的模块或者您可能通过导入其他语言的库来执行现有节点模块。 在这种情况下需要将您要在应用程序中导入的模块返回到指定的变量。

当您对require使用'new'时,除了导入要导入的模块的新实例外,它不会执行任何操作。不需要这种方法,但它可以工作。

建议仅在想要创建同一对象的多个实例和/或想要通过在同一变量中创建另一个对象的较新实例来清除旧实例时使用new。

答案 2 :(得分:-1)

想一想。

require 返回

与做:

相同
var foo = function(bar) {
    this.bar = bar;
};

var f = foo('bar');
console.log(f.bar); //ERROR
//vs:
var y = new foo('bar');
console.log(y.bar); // 'bar'

因此,您的所有代码都会调用new并返回require