JavaScript | クラス内でアロー関数とプロトタイプメソッドを大量に作った場合のメモリの違い

JavaScript JavaScript
スポンサーリンク

それでは クラス内でアロー関数(class-field)とプロトタイプメソッドを大量に作った場合のメモリの違い をわかりやすく見てみましょう。実際に JS でインスタンスを作って比較するイメージです。


1. 比較の前提

  • プロトタイプメソッド:関数はプロトタイプに1つだけ存在 → インスタンスが何千個あっても関数オブジェクトは1つ。
  • アロー関数(class-field):関数はインスタンスごとに作られる → インスタンス × 1 の関数オブジェクトがメモリに乗る。

2. 実験コード(ブラウザ/Node.jsで可)

// プロトタイプメソッド版
class ProtoWorker {
  constructor() {
    this.count = 0;
  }
  tick() {
    this.count++;
  }
}

// アロー関数(class-field)版
class ArrowWorker {
  count = 0;
  tick = () => {
    this.count++;
  }
}

// 10000個のインスタンスを作る
const N = 10000;
const protoInstances = [];
const arrowInstances = [];

console.time("ProtoWorker creation");
for (let i = 0; i < N; i++) {
  protoInstances.push(new ProtoWorker());
}
console.timeEnd("ProtoWorker creation");

console.time("ArrowWorker creation");
for (let i = 0; i < N; i++) {
  arrowInstances.push(new ArrowWorker());
}
console.timeEnd("ArrowWorker creation");

// 簡単なメモリ使用量のチェック(ブラウザの場合)
console.log("ProtoWorker[0].tick === ProtoWorker[1].tick?", 
            protoInstances[0].tick === protoInstances[1].tick); // true

console.log("ArrowWorker[0].tick === ArrowWorker[1].tick?", 
            arrowInstances[0].tick === arrowInstances[1].tick); // false
JavaScript

3. 結果の解説

  1. プロトタイプ版
    • tick は1つしかないので、10,000個作ってもメモリの増加は小さい。
    • === で比較すると同じ関数オブジェクトを参照しているのがわかる(true)。
  2. アロー関数版
    • tick は各インスタンスごとに作られる → 関数オブジェクトが10,000個存在。
    • === で比較すると異なるオブジェクトになる(false)。
    • メモリ消費はインスタンス数に比例して増える。
  3. まとめ 特徴 プロトタイプメソッド アロー関数(class-field) 関数の配置 プロトタイプ上 インスタンスごと メモリ効率 高い(共有) 低い(インスタンスごとに増える) this バインド 呼び出し方依存(bindが必要) 自動で正しい this 継承 オーバーライドしやすい インスタンス単位で固定、継承は少し扱いにくい

💡 ポイント

  • 小規模の UI やコールバックにはアロー関数が便利でバグも減る。
  • 大量インスタンスを作る場合(ゲームのキャラクターやシミュレーションなど)では、プロトタイプメソッドでメモリ効率を意識する方が良い。

タイトルとURLをコピーしました