2012-08-03 70 views
3

我有時喜歡這個JavaScript編碼差異

function class1(){ 
..... 
    class1.prototype.callme = function(){ 
     alert("hai"); 
    } 
} 
then I instantiate using (new class1()).callme(); 

創建類,有的時候,我使用模塊化模式

var class2 = (function(){ 
var privatemethod = function(){ 
.... 
} 
var publicmethod = function(){ 
alert("am public"); 
} 
return{ 
callme:publicmethod 
} 
})(); 

then I call class2.callme() 

請告訴我優勢和劣勢,可一些身體請解釋。

+0

你爲什麼要在'prototype'上創建屬性/方法_inside_構造函數?在你的第一個例子中,每當你創建一個新的'class1'實例時,'class1.prototype.callme'被覆蓋,這是一種低效率的方式。如果你真的使用'(new class1())。callme()'(即,這不是對這個問題的簡化),那麼整個類的事情就是多餘的。 – nnnnnn 2012-08-03 04:20:50

+0

只是一個例子,但我只想要優勢和劣勢 – 2012-08-03 04:25:48

+1

第一種模式並不是一個好計劃 - 它是一種反模式。實例化一個對象只是從其原型中調用一個方法,這對你沒有多大幫助,第二種方式總是會更好。如果實際上你實際上對'class1'的單個實例做了某些事情,那麼它爲第二個例子提供了一個不同的目的,但是當你沒有給出更現實的例子時,比較它們是很難的。 – nnnnnn 2012-08-03 04:30:14

回答

2

第一個是構造函數,第二個是對象,所以它們不一樣。您可能想在不同的情況下使用一種或其他。無論如何,你通常在構造函數外聲明原型,並使用this.property作爲公共方法和變量。第二個選項不能作爲類重用,除非你使用類似jQuery的extend或Underscore的_extend這是我通常這樣做的方式,似乎更簡單,沒有原型鏈臃腫的代碼。

+0

true我同意,也有一段時間,當你使用fire bug時,第一種方法不會顯示代碼,但是第二種方法不會影響代碼,那麼這也算數?糾正我,如果我錯了 – 2012-08-03 04:24:27

+0

你能給我一個擴展的例子嗎?你的意思是在新類上創建相同的方法(稱爲類3),當你擴展時,類2的方法將覆蓋類3的方法?對不起,如果你困惑你:) – 2012-08-03 04:27:59

1

對於使用Module pattern

的自由,有這隻能通過我們的模塊消耗私有函數。由於它們沒有暴露給頁面的其餘部分(只有我們導出的API是),它們被認爲是真正的私有。

鑑於函數通常被聲明並被命名,當我們試圖發現哪些函數拋出異常時,在調試器中顯示調用堆棧會更容易。

正如T.J Crowder在過去指出的那樣,它也使我們能夠根據環境返回不同的功能。過去,我已經看到開發人員使用它來執行UA測試,以便在其特定於IE的模塊中提供代碼路徑,但是我們現在可以輕鬆選擇功能檢測來實現類似的目標。

+1

雖然這是一個很好的博客文章在一般意義上說,它根本不涉及這個問題。 – nnnnnn 2012-08-03 04:24:21

+0

更新:),謝謝指出 – 2012-08-03 04:56:16