17

让我们使用以下代码创建一个 file.js:

module.exports.func = function(txt) {
    this.a = 1;
    this.b = 2;
    console.log(txt, this);
    return this;
}

现在我们有了另一个 JS 文件,我们在其中执行以下操作:

var r1 = new (require('./file')).func('r1');
var r2 = new require('./file').func('r2');

在 r1 情况下,它按预期工作 - r1 包含对新创建对象的引用。

在 r2 情况下它不起作用 - r2 从 file.js 中获取对 module.exports 的引用。

目的是通过调用 func() 构造函数来创建一个新对象。当然,我也可以这样做,等于 r1:

var r3 = require('./file');
var r4 = new r3.func('r1');

但是,我不明白为什么 r2 的行为方式与 r1 不同。

require('./file') 周围的额外括号有何不同?

4

1 回答 1

27

这两个版本根本不同。

这个:

new (require('./file')).func('r1');

执行 require,返回导出,./file然后在结果上调用 new 运算符。

这个:

var r2 = new require('./file').func('r2');

调用 require 作为构造函数。


让我们看一个更加孤立和简单的例子:

new Date() // creates a new date object
new (Date()) // throws a TypeError: string is not a function
于 2013-07-11T23:13:34.097 回答