2014-03-12 40 views
0

我想實例,是由一個函數返回一個構造函數,但是注意的是new是一個有點古怪一下:JavaScript:爲什麼我的`new`需要parens?

// 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} 

爲什麼在括號需要的?

回答

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} 
+0

'新新新功能(){返回功能(){返回函數I(){this.cannot = '偶數'}}}'謝謝:d – ChaseMoskal

2

因爲new操作員更高的優先級比操作function call

如果你想在構造函數的返回getConstructor,你必須把它包起來有函數調用執行第一。

檢查Javascript Operator Precedence

0

如果沒有括號,它看起來像getConstructor本身就是一個構造函數。請記住,new Something()嘗試創建與構造Something的對象(例如,new String())。但是,你希望你的構造函數是)返回到getConstructor(函數,所以你需要括號撥打電話到getConstructor()解析爲一個孤獨的函數調用,而不是爲new操作數。

相關問題