2

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

ケース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();

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

4

2 に答える 2

5

実際にはそのようなクラスではありませんが(JSには'emがありません)、2番目の例で得られるのは、2つの追加のコンストラクター関数です。それぞれに、必然的prototypeに独自の追加のプロパティオブジェクトがあります。

したがって、2番目のアプローチは、作成および保存されるオブジェクトの点でわずかに効率が低くなります。ただし、のインスタンスが多数ある場合Person1、2番目のアプローチでは、新しいインスタンスごとに個別にではなく、プロトタイプに共有プロパティを配置することで、(少量の)スペースを節約できます。

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

Person1インスタンスごとに1つのStringインスタンスを保存します。

実際には、実際的な違いはありません。コードがカプセル化するアイデアの最もクリーンな表現のいずれかを記述する必要があります。(個人的には、ファーストネームごとに異なるクラスがあるのは珍しいと思います...)

于 2011-07-12T21:19:29.537 に答える
1

私はjsperfテストケースhttp://jsperf.com/class-vs-object-perfを作成し、4つのアプローチを示しました。2つは作成したケースを使用し、1つはオブジェクトを返す関数を使用してモジュールパターン、および最後にプロトタイプを使用します。

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

于 2011-07-12T21:48:55.220 に答える