繁体   English   中英

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

[英]What is the difference between require() and new require()?

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

var fs = new require('fs');

var fs = require('fs');

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

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

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

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

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

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

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

  • 返回结果:

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

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

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

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

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

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

当您对require使用“new”时,它不会执行任何操作,只会导入要导入的模块的新实例。 不需要此方法,但它可以工作。

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

想一想。

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'

所以你的所有代码都是从require返回调用new

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM