2011-07-12 83 views
1

我想知道與創建新類相關的開銷而不是該類的新對象是小還是大。我使用dojo,但我會提供純JS的例子。我將在啓動時創建10到100個對象,我不認爲這會是一個嚴重問題,但我想涵蓋所有的基礎。與類對象相關的Javascript開銷

案例1:Javascript對象

function Person(name){ 
    this.name = name; 
} 
var p1 = new Person('Caine'); 
var p2 = new Person('Seth'); 
var p3 = new Person('Abel'); 

對戰案例2:JavaScript類

function Person1(){ 
    this.name = 'Caine'; 
} 

function Person2(){ 
    this.name = 'Seth'; 
} 

function Person3(){ 
    this.name = 'Abel'; 
} 
var p1 = new Person1(); 
var p2 = new Person2(); 
var p3 = new Person3(); 

編輯:人們想知道爲什麼我會永遠採取這種做法。我正在實現一個模塊化程序,用戶根據需要創建和/或加載對象,而不是使用一個Person/Shape/Text ...類並使用50,000,000個參數(名稱,年齡,性別,標籤,字體, x,y,w,h ...)我想創建一個包含所有值的類。這也將簡化編輯代碼,因爲我希望允許用戶從瀏覽器中查看和修改代碼。我不是新來的面向對象,我意識到這是一個偏離標準編程過程,所以有一點相信,我知道我在做什麼=)

+0

爲什麼會有人做案例2?這是更多的代碼,更少的靈活性,並且除非你要製作很多Person2對象,否則我不會看到任何優勢。 – jfriend00

回答

5

沒有真正的類(JS沒有'em),但是你在第二個例子中有兩個額外的構造函數。每個必須擁有其自己的附加prototype屬性對象。

因此,第二種方法在創建和存儲對象方面效率稍低。如果你有很多Person1實例,但是,第二種方法可以節省空間(很少量的)通過戴上原型的共享屬性,而不是單獨對每一個新的實例:

function Person1() {} 
Person1.prototype.name= 'Caine'; 

節省一個字符串實例每個Person1實例。

在現實中,它不會產生任何實際的區別,你應該寫出你的代碼封裝的想法的最乾淨的表達。 (我個人認爲這對於每個名字都有不同的類別是不尋常的......)

1

我寫了一個jsperf測試用例http://jsperf.com/class-vs-object-perf來演示4種方法,2使用你寫的例子,1使用一個返回對象的函數,可以適應模塊模式,最後使用原型。

在Chrome 14上,1,2,4之間的性能差異幾乎相同。唯一慢的是與模塊模式類似的那個。

+0

感謝您的測試,我以前從未見過jsperf。對我來說,模塊模式也是最慢的 – puk