JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでオブジェクトのメソッドをクリックハンドラーにバインドする方法


JavaScriptでイベント処理を実装する際、オブジェクトのメソッドをそのままクリックハンドラーとして登録すると、thisの参照が意図しないものへと変わり、思うように動作しないことがあります。本記事では、アロー関数を活用してオブジェクトのメソッドをクリックハンドラーに正しくバインドする方法を、実際のコード例とともにわかりやすく解説します。

実装例:クリック回数をカウントするデモ

以下は、ボタンがクリックされた回数をオブジェクトのプロパティで管理し、その結果を画面に表示するサンプルコードです。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
    body {
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    .result {
        font-size: 20px;
        font-weight: 500;
        color: blueviolet;
    }
</style>
</head>
<body>
<h1>Binding an object's method to a click handler in JavaScript</h1>
<div class="result"></div>
<br />
<button class="Btn">Click Here</button>
<h3>上のボタンをクリックすると、クリックした回数が表示されます</h3>
<script>
    let resEle = document.querySelector(".result");
    let BtnEle = document.querySelector(".Btn");
    let testObj = {
        a: 0,
        timesClicked() {
            this.a += 1;
            resEle.innerHTML = "Times clicked = " + this.a;
        },
    };
    BtnEle.addEventListener("click", () => {
        testObj.timesClicked();
    });
</script>
</body>
</html>

コードのポイント

  • オブジェクトの構造: testObjは、クリック回数を保持するプロパティaと、その値を更新・表示するメソッドtimesClicked()を持っています。
  • アロー関数によるバインド: addEventListenerのコールバックにアロー関数を使うことで、外側のスコープのthisが引き継がれます。そのため、timesClicked()内部のthisは確実にtestObjを指し、プロパティaを正しく操作できます。
  • 状態の管理: ボタンをクリックするたびにthis.aが1ずつ増加し、その値が.result要素に表示されます。

実行結果

ページを開くと「Click Here」ボタンが表示され、その下には案内テキストが配置されています。

JavaScriptでオブジェクトのメソッドをクリックハンドラーにバインドする方法

「Click Here」ボタンをクリックすると、クリックした回数が青紫色のテキストで表示されます。

JavaScriptでオブジェクトのメソッドをクリックハンドラーにバインドする方法

代替手法:bind()メソッドを使う方法

アロー関数でラップする代わりに、Function.prototype.bind()を使ってthisを明示的に固定する方法もあります。

BtnEle.addEventListener("click", testObj.timesClicked.bind(testObj));

この書き方であれば、メソッドを直接ハンドラーとして渡しても、thisが常にtestObjを指すようになります。状況に応じて、より簡潔なこちらの手法を選ぶのも良いでしょう。

まとめ

通常の関数をそのままコールバックとして渡すと、thisはイベント発生元の要素(この例ではボタン)を指してしまいます。アロー関数でメソッド呼び出しをラップするか、bind()でコンテキストを固定することで、オブジェクトのメソッドをイベントハンドラーとして安全かつ確実に利用できるようになります。


  1. JavaScriptにおけるオブジェクトの分割代入(Destructuring)の使い方

    JavaScriptでは、分割代入(Destructuring)と呼ばれる構文を使うことで、オブジェクトから特定のプロパティを簡単に取り出し、個別の変数に代入することができます。従来の方法では、obj.firstName のようにプロパティへ一つずつアクセスする必要がありましたが、分割代入を使えば1行で簡潔に記述できます。オブジェクトの分割代入の基本構文基本的な書き方は以下の通りです。let { プロパティ名1, プロパティ名2, プロパティ名3 } = オブジェクト;波括弧 {} の中に取り出したいプロパティ名を列挙するだけで、同名の変数にそれぞれの値が代入されます。実装例以下は、オブジェク

  2. JavaScriptのObject.keys().map()とArray.map()の違いを徹底解説

    JavaScriptにおいて、Array.map()は配列の各要素に関数を適用し、その結果を新しい配列として返すメソッドです。一方、オブジェクトには直接map()メソッドが用意されていないため、Object.keys().map()という形で、まずObject.keys()を使ってオブジェクトのキーを配列として取得し、そこにmap()を適用するのが一般的なテクニックとなります。 この記事では、両者の使い方の違いを、実際に動作するサンプルコードと実行結果をもとにわかりやすく解説します。 サンプルコード 以下は、Object.keys().map()とArray.map()の動作を比較できるJa