2014-03-03 17 views
1

有沒有使用這種模式的任何缺點?在IIFE包裹構造和原型方法的任何缺點?

var Animal = (function() { 
    function Animal(name) { 
    this.name = name; 
    } 

    Animal.prototype.move = function(meters) { 
    return alert(this.name + (" moved " + meters + "m.")); 
    }; 

    return Animal; 

})(); 

我認爲這是很好的可讀性封裝在立即調用函數表達式的一切,我知道這是什麼CoffeeScript中的類編譯成。

+2

在您的特定示例中,沒有任何結果,因爲使用IIFE創建的私有範圍從未被利用。 – levi

+1

這是一個很好的方法。非常靈活,允許私人功能和原型。另外,你不要將實現分散在整個文件中,一切都在IIEF中。 – dfsq

+1

唯一的缺點是如果你在IIFE中有非常大的變量,它就不會超出範圍,除非你刪除它們或者將它們設置爲像undefined那樣耗費較少的東西。對於延遲加載的功能,您可以隨時添加到原型,但這些方法將無法訪問共享私有。 – HMR

回答

1

也不是那麼緊密,我通常使用的快捷鍵這樣的:

var Animal = Object.extend({ 
    initialize: function (name) { 
     this.name = name; 
    }, 
    move: function(meters) { 
     return alert(this.name + (" moved " + meters + "m.")); 
    } 
}); 

var Animal = Class({ 
    initialize: function (name) { 
     this.name = name; 
    }, 
    move: function(meters) { 
     return alert(this.name + (" moved " + meters + "m.")); 
    } 
}); 

否則有你們的做法沒有問題,所以OFC,你可以使用它.. 。

有通過數據隱藏的優勢,你可以把你的構造成封閉使用靜態私有變量(如果我們想談談類)。我們通常在模塊級別使用這種方法來進行數據隱藏,但通過構造函數它不值得花費精力...