JavaScript:为什么我的`new`需要parens?

时间:2014-03-12 07:19:26

标签: javascript

我想实例化一个函数返回的构造函数,但注意到new有点古怪:

  // This function returns a constructor function
function getConstructor(){ return function X(){this.x=true} }

getConstructor();       //=> function X(){this.x=true}
new getConstructor();  //=> function X(){this.x=true}

new (getConstructor());  //=> X {x: true}

为什么需要parens?

3 个答案:

答案 0 :(得分:3)

在第一种情况下,new调用getConstructor函数作为对象的“构造函数”。该函数返回另一个函数(您已明确设置) - 这就是function X(){this.x=true}输出的原因。

在第二种情况下,parens使new关键字调用该函数,即从getConstructor执行返回

为了更好地理解:

function getConstructor(){ return function X(){this.x=true} }

var func = getConstructor();       //=> function X(){this.x=true}
var instance = new func(); //=> X {x: true}

答案 1 :(得分:2)

由于new运算符的优先级高于function call运算符

如果你想要getConstructor返回的构造函数,你必须将它包装起来让函数调用先执行。

检查 Javascript Operator Precedence

答案 2 :(得分:0)

没有parens,看起来getConstructor本身就是一个构造函数。请记住,new Something()尝试使用构造函数Something创建对象(例如。new String())。但是你希望你的构造函数是返回给getConstructor()的函数,所以你需要parens来调用getConstructor()解析为一个单独的函数调用而不是new的操作数。