我的问题的核心是,有什么区别
var fs = new require('fs');
和
var fs = require('fs');
如果我对所有模块都使用 new
会有任何影响或注意事项吗?
在使用 Webstorm 时,我注意到只有使用 new require('fs')
才能让智能感知工作。在我开始持续使用它以获得更好的开发体验之前,我想了解更多关于它的信息。
最佳答案
首先:不要将 new require("...")
(调用 require
作为构造函数)与 new (require("..."))
(调用 require
调用的返回值 作为构造函数)。你正在做第一个。
require
不打算作为带有 new
的构造函数调用。这不是 Node 惯用的,而且通常很奇怪。你不应该这样做,因为它会降低代码的可读性。 future 的读者可能很容易将其误认为是 new (require("..."))
(即,在由<返回的构造函数上调用 new
/em> require
), 因为正常的 Node 样式不使用 new
和 require
。
现在,让我们谈谈实际的副作用。
new
导致函数运行其 [[Construct]]
internal method ,它执行以下操作:
调用函数时将
this
设置为新创建的对象,该对象的原型(prototype)设置为函数的prototype
属性返回一个结果:
- 如果函数返回一个对象,则返回函数的结果
- 如果函数返回任何其他内容,则返回新创建的
this
对象
返回值 new require
将与所有 exports
值为非原始值的模块的 require
相同(这是真的几乎任何模块;它们通常导出一个普通对象或一个函数,这也是一种对象)。不过,在极少数情况下,您的模块确实会导出原始值,new
将拒绝您访问该值。
require(...)
和 new require(...)
之间唯一可能的区别是 new
变体是提供了不同的 this
值。但是,require
似乎完全忽略了它的 this
值。 (请注意,Module.prototype.require
—— 与普通 require
不同的函数 —— 确实使用了它的 this
值,但只有在你需要一个模块的子模块,使用 module.require(...)
。)
关于javascript - require() 和 new require() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787074/