2011-07-12 14 views
1

そのクラスの新しいオブジェクトの代わりに新しいクラスを作成することに伴うオーバーヘッドが小さいか大きいかどうかは疑問でした。私は道場を使用していますが、私は純粋なJSの例と対比して説明します。私は起動時に一度10〜100個のオブジェクトを作成しますが、これは深刻な問題ではないと思いますが、すべてのベースをカバーしたいと思います。クラス対オブジェクトに関連付けられたJavascriptオーバーヘッド

ケース1:JavaScriptオブジェクトケース2対

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

: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(); 

EDIT:人々は私が今までこのアプローチを取る理由を知りたいです。私は、ユーザが1つのPerson/Shape/Text ...クラスを持ち、それを50,000,000の引数(名前、年齢、性別、ラベル、フォントなど)で呼び出すのではなく、必要に応じてオブジェクトを作成したり読み込んだりするモジュール式プログラムを実装しています。 x、y、w、h ...)すべての値を持つ単一のクラスを作成したい。これにより、ユーザーがブラウザ内からコードを表示および変更できるようにするため、コードの編集も簡単になります。私はOOPの新人ではないし、これは標準的なプログラミング手順からの出発点であることを認識しているので、私が何をしているかを少しは信じている=)

+0

なぜケース2を行うのですか? Person2オブジェクトをたくさん作るつもりがない限り、コードはより多く、柔軟性は低く、私が見ることができる利点はありません。 – jfriend00

答えて

5

JSは'em)、2番目の例では2つの追加のコンストラクタ関数があります。それぞれには必然的に追加のprototypeプロパティオブジェクトが必要です。

したがって、2つ目の方法は、作成され格納されるオブジェクトの点で、ほとんど効果がありません。

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

1つの文字列のインスタンスを保存する:あなたはPerson1のインスタンスをたくさん持っていた場合は、しかし、第二のアプローチは、それぞれの新しいインスタンスに個別にプロトタイプ上の共有財産を置く代わりにして領域(の小さな量)を救うことができますPerson1インスタンスごとに。

現実にはそれほど実用的な違いはありません。コードがカプセル化したアイデアの中で最もクリーンな表現であれば、どちらでもよいでしょう。 (個人的には、名前ごとに異なるクラスを持つことは珍しいと思います...)

1

私はjsperfテストケースを書きました。http://jsperf.com/class-vs-object-perf、4つのアプローチを示します。オブジェクトを返し、モジュールパターンに適合させる関数、プロトタイプを使用する最後の関数です。

Chrome 14では、1,2,4のパフォーマンスの差はほぼ同じです。遅いのはモジュールパターンに似たものだけです。

+0

テストのおかげで、私は前にjsperfを見たことがなかった。私のためには、モジュールのパターンは最も遅かった – puk

関連する問題