JavaScript | クラス内でアロー関数を使う理由

JavaScript JavaScript
スポンサーリンク

クラスの中でアロー関数を使う理由は、主に this の扱い にあります。初心者がよくつまずくポイントなので、例を交えて整理しますね。


通常のメソッドとアロー関数の違い

通常のメソッド

class Counter {
  constructor() {
    this.count = 0;
  }

  increment() {
    console.log(this); // 呼び出し方によって変わる
    this.count++;
  }
}

const c = new Counter();
c.increment(); // OK → this は c を指す
const fn = c.increment;
fn(); // エラー → this が undefined(またはwindow)になる
JavaScript

→ 通常のメソッドは、呼び出し方によって this が変わるため、イベントハンドラやコールバックに渡すときに this が失われやすいです。


アロー関数を使った場合

class Counter {
  constructor() {
    this.count = 0;
  }

  // プロパティにアロー関数を代入
  increment = () => {
    console.log(this); // 常にクラスのインスタンスを指す
    this.count++;
  }
}

const c = new Counter();
c.increment(); // OK
const fn = c.increment;
fn(); // これでもOK → this は c のまま
JavaScript

→ アロー関数は 自分専用の this を持たず、外側の this を固定的に使う ので、呼び出し方に左右されません。


クラス内でアロー関数を使うメリット

  • イベントハンドラで便利
    DOMイベントやReactのイベントで this が変わらないので、bind(this) を書かなくて済む。
class Button {
  constructor(label) {
    this.label = label;
    document.querySelector("button")
      .addEventListener("click", this.handleClick);
  }

  handleClick = () => {
    console.log(this.label); // 常にインスタンスのlabelを参照できる
  }
}
JavaScript
  • コールバック関数に渡しても安全
    setTimeoutや配列操作に渡しても this が壊れない。
class Timer {
  constructor() {
    this.seconds = 0;
  }

  start = () => {
    setInterval(() => {
      this.seconds++;
      console.log(this.seconds);
    }, 1000);
  }
}

const t = new Timer();
t.start(); // 秒数が正しくカウントされる
JavaScript
  • コードがシンプルになる
    constructor 内で this.method = this.method.bind(this) と書く必要がなくなる。

⚠️ 注意点

  • クラスのプロトタイプにメソッドが追加されず、インスタンスごとに関数が作られるため、メモリ効率は通常メソッドより劣る場合があります。
  • そのため、イベントハンドラやコールバックで使うメソッドはアロー関数
    共通処理で多くのインスタンスが共有するメソッドは通常のfunction、と使い分けるのが実務的です。

✅ まとめ

クラス内でアロー関数を使う理由は、this を固定できるから。特にイベントハンドラやコールバックで「this がundefinedになる」問題を避けられるのが大きなメリットです。

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