2011-10-26 87 views
1

我在寫一些的CoffeeScript剛纔和得到一個奇怪的錯誤:new thing(param)和new(thing(param))有什麼區別?

TypeError: Thing(param) is not a constructor

但它是!當我嘗試在控制檯:

var that = new Thing(param); 
that.doesSomething(); 

有點混亂後,我通過編譯源看去,發現了coffee編譯that = new Thing paramthat = new(Thing(param));。奇怪的;我以前從來沒有見過。所以我馬上嘗試一下:和田!現在,我可以複製:

var that = new(Thing(param)); 
that.previousLineErrorsOut(); 

(順便說一句,the CoffeeScript generator on its home page產生new Thing()形式的情節變得...。)

我也嘗試一下用默認構造函數(new Worker("somefile")new(Worker("somefile"))),它們的行爲與「正確「,就是說,這兩種形式沒有區別。

所以我徹底困惑:什麼是new()?爲什麼在某些情況下失敗? 爲什麼CoffeeScript將我的完美精緻new轉換爲new()

+0

的CoffeeScript.org上的CoffeeScript控制檯目前使用最新版本的CoffeeScript 1.1.2。如果您的本地CoffeeScript安裝行爲不同,它必須是不同的版本。 –

+0

沒有。它是1.1.2,直接npm。 –

+0

你能給我舉一個例子,說明你的系統上編譯的JS與Try CoffeeScript控制檯中編譯的JS有什麼不同嗎? –

回答

1

new需要一個表達式來表示構造函數和可選的括在括號中的參數列表。例如:

new Thing; // equivalent to next line 
new Thing(); // most common form 
new (function() {})(); // calls the anonymous function as a 
         // constructor with no arguments 
new (function() {}); // equivalent to previous; if no arguments are 
         // specified to new, it will call with no arguments 

當你這樣做:

new(Thing(param)); 

它試圖運行調用Thing的說法param與無參數的構造函數的結果。 new後的圓括號代表構造函數的表達式Thing(param)。由於Thing沒有在你的情況下返回一個構造函數,它失敗了。這大致相當於這個:

var clazz = Thing(param); 
var instance = new clazz(); 

我不知道爲什麼CoffeeScript轉換它的方式。

+0

我不知道是否有解決方法...或者我只需要叉CS? –

+0

@FélixSaparelli:不幸的是,我不知道解決方法。我沒有安裝CoffeeScript(我寧願不爲此問題安裝它),但您可能需要確保您的安裝是最新的。 – icktoofay

+0

明白了:'new(Thing)(param)'。很簡單,但很混亂。 –

1

構造狀呼叫

new Thing(params) 

和函數狀呼叫

Thing(params) 

之間的差別是,在第一情況下,功能體的內部的this關鍵字被綁定到對象被創建,而在第二種情況下它被綁定到全局對象(瀏覽器中的一個窗口)

new(Thing(params)) 

是一個很奇怪的形式,而這種形式的Thing首先被調用的功能等,那麼它的結果正在試圖agains的new字爲無PARAMS構造。

你的CS像這樣編譯它是非常奇怪的。

我試圖在他的官方網站(http://jashkenas.github.com/coffee-script/時,儘量CoffeeScript的選項卡)並將其編譯

that = new Thing param 

var that; 
that = new Thing(param); 
+1

在問題中提到官方網站的版本是這樣編譯的。 「(順便說一句,其主頁上的CoffeeScript生成器會生成新的Thing()表單,該圖會變粗......)」 – icktoofay

相關問題