我的问题的核心是,
之间有什么区别var fs = new require('fs');
和
var fs = require('fs');
如果我在所有模块中使用new
,是否有任何影响或警告?
在使用Webstorm时,我注意到只有在使用new require('fs')
时我才能使intellisense工作。在我开始一直使用它以获得更好的开发体验之前,我想了解更多信息。
答案 0 :(得分:5)
首先:请勿将new require("...")
(调用require
作为构造函数)与new (require("..."))
混淆(调用返回值<作为构造函数的require
调用的/ em>。你正在做第一个。
require
无意作为new
的构造函数调用。那不是Node-idiomatic,而且通常很奇怪。您不应该这样做,因为它会降低代码的可读性。未来的读者可能很容易将其误认为new (require("..."))
(即,在由 new
返回的构造函数上调用require
,因为正常的Node样式不会将new
与require
一起使用。
现在,我们来谈谈实际的副作用。
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