-1

JavaScript で OOP を行う一般的な方法の 1 つは、組み込みのプロトタイプ、コンストラクター、および演算子を使用する代わりに、関数が関連付けられたオブジェクトを使用することnewです。ミックスインは、メンバー変数を貼り付けて継承をシミュレートすることにより、2 つのオブジェクトを結合するためによく使用されます。

この場合、特定のベンチマークではあまり情報が得られないため、この種のプラクティスがパフォーマンスに影響を与えるかどうかを測定することは困難です。そのようなパフォーマンスのペナルティはありますか? また、その深刻度はどの程度ですか?

4

2 に答える 2

2

コンストラクター、プロトタイプ、s などを使用して OOP を行う場合new、これは V8 (Chrome および Node.js の JS エンジン) が特別に最適化するものです。ユーザー プロパティは、C++ や Java オブジェクトのように、内部プロパティと並べて保存されます。

V8 の調整に使用されるベンチマークの 1 つは、このhttp://octane-benchmark.googlecode.com/svn/latest/deltablue.jsのようにオブジェクト指向に重点を置いています。

プロパティを動的にアタッチしたり、その他の卑劣なトリックを実行したりすると、もちろん、ヒューリスティックを混乱させ、おそらく後退するでしょう。

もちろん、これはエンジン固有のものです。

また、「クリック ハンドラーがテキスト領域を表示する」などの UI コードを実行している場合、これは問題ではないという一般的な免責事項についても言及する必要があります。すべてのメソッド呼び出しでスタック トレースを収集しても、パフォーマンスの問題に気付かない場合があります。

于 2013-09-19T03:53:29.433 に答える
1

これが心配な場合は、プロトタイプに混入することもできますが、Bergi が言うように。メソッドを何度も呼び出すと、プロトタイプではなくインスタンスにメソッドがある場合、実際にはルックアップが短くなります。

プロトタイプでミックスインする方法は次のとおりです。

function mixin(source, target){
  for(thing in source){
    if(source.hasOwnProperty(thing)){
      target[thing]=source[thing];
    }
  }
};
var canSpeak = function(){
  //initialize instance specific values
  this.canSpeakMessage="Hello World";
  this.someArrayThatNeedsToBeInitialized=[];
};
canSpeak.prototype.speak = function(){
  console.log(this.canSpeakMessage);
}
var Test= function(){
  //init instance specific values for canSpeak
  canSpeak.apply(this,arguments);
};
mixin(canSpeak.prototype,Test.prototype);


var t = new Test();
t.speak();//=Hello World
于 2013-09-19T15:56:29.517 に答える