2012-11-28 57 views
5

從單個實例和多實例的角度來看,爲什麼我會在模塊模式之後編寫所有這些額外的代碼行,而只是使用標準構造函數來定義方法和屬性在構造函數體中?JavaScript模塊模式vs構造函數,使用構造函數中定義的方法

模塊模式樣本:http://jsfiddle.net/T3ZJE/1/

var module = (function() { 
    // private variables and functions 
    var foo = 'bar'; 

    // constructor 
    var module = function() { 
    }; 

    // prototype 
    module.prototype = { 
     constructor: module, 
     something: function() { 
     } 
    }; 

    // return module 
    return module; 
})(); 

var my_module = new module(); 

console.log(my_module) 


構造樣本:http://jsfiddle.net/EuvaS/2/

function Module(){ 

    // private variables and functions 
    var foo = 'bar'; 

    //public methods 
    this.something = function() { 

    }   
} 

var my_module = new Module(); 

console.log(my_module); 

對我來說,最終的結果是幾乎一樣的。兩者都可以具有公共屬性和方法,都可以具有可以通過公共方法訪問的「私有」變量和方法。

兩者都將爲單例定義公共/原型方法,兩者都會爲對象的多個實例/克隆多次定義它們。

我錯過了什麼嗎?有什麼不同?

回答

14

在第一個示例中,foo將是module()的所有實例的通用靜態變量。意思是,所有實例都會引用相同的變量。

在第二個示例中,每個Module()實例的foo都不相同。

除此之外,我沒有看到任何區別。

+0

這確實是一個重要的區別。 – Fergal

+1

對於poops和giggles,這個對Constructor方法的輕微修改將創建靜態私人變量,並且只允許一次定義我們的公共方法,同時允許它們訪問構造器範圍中的所有私人變量:http://jsfiddle.net/zHwQX/2/ – Fergal

+0

@Fergal好點,也沒有看到這一點。所以我想整體,更多的功能和更小的內存佔用 – Damp

0

沒有什麼特別的區別。但我不確定本例中模塊模式的重點。您不需要在模塊中包含構造函數。構造函數應該像第二個樣式一樣使用。但是,除非每個實例都需要定義方法,否則最好在其原型對象中定義方法。

再次就目的而言,我不認爲這裏的模塊模式是正確的方式。

+0

我從這裏得到了這個片段:http://briancray.com/posts/javascript-module-pattern – Fergal

+0

@Fergal那麼,我不確定他的意見是否適合於模式。正如你在你的問題中提到的,模塊中的構造函數是額外的工作,這是不必要的,我想。我找不到任何優點。 –