2013-04-27 171 views
1
var Foobar = function() {}; 

Foobar.prototype.clickDetails = function() { 
    $("#foobar").html("test"); 
} 

and 

var Foobar = function() { 
     return { 
      clickDetails: function() { 
       $("#foobar").html("test"); 
      } 
     }; 
}(); 

我想知道,因爲後者是存在的,但我無法得到它與茉莉花一起工作,我寫了第一個從頭開始。兩者有什麼區別?這兩種定義類/對象的方式有什麼區別?

+4

你的問題基本上與jQuery無關。這是一個關於JavaScript的問題。我已經添加了相關的標籤。 – 2013-04-27 22:16:15

+0

一個需要'new',另一個不需要。一個爲每個對象創建不同的功能,一個在原型對象上存儲一個。哎呀,我錯過了:一個是單身人士,另一個是建設者。 – Bergi 2013-04-27 22:18:46

+0

當您在10秒前發佈評論時,您如何在評論中擁有+1? Aussming需要5秒鐘的時間來讀取它,另外3秒鐘來確定它是否值+1並實際添加它,它留下了2秒的時間間隔以供某人找到它,這似乎不太可能。你會提高你自己的意見嗎? :/ – Virus721 2013-04-27 22:19:12

回答

5

因爲你有()在你的第二個例子結束(謝謝你,BERGI!),您執行的是第二個函數立即存儲結果Foobar。因此,第一個示例創建了一個函數,該函數可以通過new(可以重複使用clickDetails的單個副本)創建對象,第二個示例創建一個非函數對象。

如果沒有()在你的第二個示例的末尾,如:

var Foobar = function() { 
     return { 
      clickDetails: function() { 
       $("#foobar").html("test"); 
      } 
     }; 
}; // <== No() here 

...那麼就會有兩個不同點:

  1. 在你第一個示例中,只有一個clickDetails功能,該功能由通過new Foobar()(通過原型鏈)創建的所有對象共享。在第二個示例中,每次調用Foobar()時都會創建一個新的clickDetails函數。

  2. 在第一個示例中,您通過var obj = new Foobar();(您使用關鍵字new)創建對象。在你的第二個,只是var obj = Foobar();(雖然你可以使用new關鍵字,它沒有任何有用的影響,是誤導)。

+2

我一開始也認爲,但實際上第二個是(變相)IEFE。 – Bergi 2013-04-27 22:21:09

+0

這是誤導性的,因爲1st返回一個繼承Foobar原型的對象,而2nd只返回一個帶有函數的對象。 – numbers1311407 2013-04-27 22:21:15

+0

@Bergi:是的,謝謝,我看到你對這個問題的評論,並說「但它不是一個單身人士」,直到我意識到......這是。 :-)(我想我已經設法在刪除它之前讓自己看起來像一個普通的普拉特。) – 2013-04-27 22:23:12

相關問題