2011-08-19 42 views
1

所以我有一個相當大的面向對象的JavaScript類,約120的功能(很多getter和setter)。其中一些函數的變量基本上是常量。面向對象的JavaScript /變量聲明/性能

什麼我不知道,是我應該在對象的全局範圍內聲明這些變量,所以每次運行該功能時它時不必重新聲明變量?

一個示例函數是下面。 this.displayContacts會運行好幾次(並且會一直在對象中運行),所以在這種情況下,在函數內部聲明'codes'對象是沒有意義的。

function orderObject() { 

    this.displayContacts = function() { 
    var codes = {'02':'02','03':'03','07':'07','08':'08'}; 
     // do something with codes 
    }; 

} 

那麼,這會更好,性能明智嗎?

function orderObject() { 
var codes = {'02':'02','03':'03','07':'07','08':'08'}; 
    this.displayContacts = function() { 
    // do something with codes. 
    }; 

} 

我的另一個擔心是,如果我結束了很多全局變量/對象的主要orderObject裏面,那將是一個性能損失的不僅僅是簡單地重複聲明每次變量?

+0

你試過了嗎? –

+0

在我開始改變它之前,我想要收集有關垃圾收集和任何全球範圍問題的建議。 Theres〜3400行代碼都在這裏,所以它需要一段時間的大聲笑。 – Benno

回答

1

絕對。

function MyClass() { 
    this.somevar = ''; // instance scoped variable 
}; 

MyClass.CODES = {'02':'02'...}; // 'Class' scoped variable; one instance for all objects 

MyClass.prototype.instanceMethod = function(){ 
    // 'this' refers to the object *instance* 
    // it can still use MyClass.CODES, but can also account for variables local to the class 
} 

CONSTANT可以這麼說,在java-talk中。如果您的codes對類(以及您的應用程序的其餘部分)是全局的,那麼您將通過這種方式節省大量開銷 - 只定義一次對象。請注意,對於函數不需要對特定於類實例的變量進行操作的情況,也可以使用「靜態」類級方法。

除非你的應用程序是非常結實,性能優化可能不會使其明顯加快。但是,這並不意味着面向對象的設計是不值得的 - 而如果你要以面向對象的方式使用JavaScript,那麼使用好的面向對象的原則並不難,也不是一個壞主意。

+0

感謝您的洞察力。我注意到你使用了prototype.instanceMethod,那麼這是否意味着MyClass.prototype.displayContacts?或者在函數內部,this.prototype.displayContacts?使用.prototype有什麼好處?我一直有點困惑,以及:p – Benno

+0

@benno - 看看這個問題:http://stackoverflow.com/questions/4650513/why-is-javascript-prototyping/4650576#4650576 – hvgotcodes

+0

謝謝你的。目前我不確定原型方法是否會產生很大的變化,因爲只有一個對象的調用,但是我打算將它分解爲更易於管理的塊(即,訂單對象和產品對象),所以當我有多個產品對象時,原型會更有利於我的猜測。爲此歡呼!將節省很多表現! – Benno

1

我要說的是,如果您有您正在使用在多個地方的東西,它應該成爲你的對象的屬性,使之不必每次都重新聲明。如果這個常數必須改變,它也將有助於使對象的維護更容易。然後你只能在一個地方改變它,而不必搜尋你使用它的所有位置。

不要重複自己。

+0

謝謝:)我想我會在可能的情況下沿着這條軌道走下去 – Benno

1

垃圾收集在JavaScript依賴於瀏覽器和多數現代瀏覽器處理它相當不錯。如果繼續前進並使其成爲全局的,那麼您可能會看到性能略有提高,因爲它並不是每次都執行該代碼行。然而,我無法想象通過在課堂上使用這些靜態屬性來顯着提高性能,但如果它們沒有改變,那麼它會更有意義。

+0

謝謝你。是的,我不太確定垃圾收集如何處理擁有許多全局範圍變量而非非全局變量。我只是想盡可能多地進行優化,因爲在一段時間之後,它會有點遲緩。 – Benno