2012-02-23 91 views
2

我正在使用Javascript庫(openlayers),並試圖優化一些類以減少整體內存佔用。我注意到,對於某些類,我不需要該類的大部分方法 - 它們將永遠不會被調用。未使用的Javascript對象方法如何影響內存使用?

我正要重寫其中的一些類,剝離出我不需要的方法,但在此之前我想弄清楚這對於內存佔用會不會有任何明顯的影響,如果我是從精簡的類中實例化10,000個對象。很明顯,如果我刪除將幫助但我不確定方法的屬性。

任何人都可以解釋如何存儲方法,他們消耗多少內存,並可能推薦任何好書或其他資源,我可以在這種類型的知識骨骼?

編輯:謝謝澄清定義在構造函數與原型的方法之間的區別。它似乎是一個混雜的包,但爲了爭論讓我們假設它們是在構造函數中定義的(它出現的位置對它們影響最大)。

+3

方法是在每個實例上還是在'prototype'上聲明的?如果他們在「原型」上,則不太可能產生很大的差異,因爲所有實例都有效地共享該方法的一個副本。 – 2012-02-23 21:22:04

+0

它們在構造函數中定義在對象上,還是通過'prototype'在實例之間共享?您必須展示一些代碼,並理想地通過性能分析器運行您的代碼以準確查看內存瓶頸的創建位置。 – zzzzBov 2012-02-23 21:23:15

+0

@James和zzzzBov - 我已根據您的意見更新了OP(感謝您的評論)。 – TheOx 2012-02-23 21:38:23

回答

4

我認爲這取決於是否在內存中爲對象的每個實例創建了方法的副本。例如:

var MyObj = function(x) { 
    this.doStuff = function() { 
     //Do some stuff 
    }; 
    this.someProperty = x; 
}; 
//myInstance will have its own copy of the doStuff method 
var myInstance = new MyObj(10); 

在上面的代碼中,MyObj每個實例將需要doStuff在存儲器中的副本。然而,如果在prototype聲明的方法,這是一個不同的故事:

var MyObj = function(x) { 
    this.someProperty = x; 
}; 
MyObj.prototype.doStuff = function() { 
    //Do some stuff 
}; 
//myInstance can still access doStuff, but all instances share one copy 
var myInstance = new MyObj(10); 

這一次,MyObj每個實例都有自己的屬性someProperty,但是當你調用doStuff方法,它不是在實例中發現本身,所以prototype被看作是在它被發現和執行的地方。

但是,如果像您所說的那樣,有些方法根本沒有被調用,我不認爲有任何理由讓它們在任何地方被聲明。就我個人而言,我會擺脫它們(除非它們有可能在未來提供價值)。但是我不知道你的代碼,所以這是你必須做出的決定。

+0

這就是我一直在尋找的東西 - 感謝您提供簡潔明瞭的答案! – TheOx 2012-02-23 21:43:12

+0

沒問題,很高興我可以幫助:) – 2012-02-23 21:44:00

相關問題