我想实例化一个函数返回的构造函数,但注意到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?
答案 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
返回的构造函数,你必须将它包装起来让函数调用先执行。
答案 2 :(得分:0)
没有parens,看起来getConstructor本身就是一个构造函数。请记住,new Something()
尝试使用构造函数Something
创建对象(例如。new String()
)。但是你希望你的构造函数是返回给getConstructor()的函数,所以你需要parens来调用getConstructor()解析为一个单独的函数调用而不是new
的操作数。