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

JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

JavaScriptでは、call()apply()bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。

3つのメソッドの違い

  • call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。
  • apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。
  • bind()thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミングで呼び出せます。

以下は、call()を使ってオブジェクトobjwelcomeメソッドを、別のオブジェクトobj1が借用するサンプルコードです。

サンプルコード

<!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,.sample {
      font-size: 18px;
      font-weight: 500;
      color: rebeccapurple;
   }
   .result {
      color: red;
   }
</style>
</head>
<body>
<h1>JavaScriptでメソッドを借用する</h1>
<div class="sample"></div>
<div class="result"></div>
<button class="Btn">CLICK HERE</button>
<h3>上のボタンをクリックすると、objのwelcomeメソッドをobj1が借用して実行します</h3>
<script>
   let sampleEle = document.querySelector(".sample");
   let resultEle = document.querySelector(".result");
   let obj = {
      firstName: "Rohan",
      lastName: "Sharma",
      welcome() {
         return "Welcome " + this.firstName + " " + this.lastName;
      },
   };
   let obj1 = {
      firstName: "John",
      lastName: "Shaw",
   };
   sampleEle.innerHTML = "obj.welcome() = " + obj.welcome();
   document.querySelector(".Btn").addEventListener("click", () => {
      resultEle.innerHTML = "obj1.welcome() = " + obj.welcome.call(obj1);
   });
</script>
</body>
</html>

実行結果

上記のコードを実行すると、まず画面に次のように表示されます。

JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

この時点では、obj.welcome()が自分自身のプロパティを使い「Welcome Rohan Sharma」という結果を返しています。

続いて「CLICK HERE」ボタンをクリックすると、次のように表示されます。

JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

コードのポイント

ここで注目すべきは obj.welcome.call(obj1) の部分です。welcomeメソッド自体はobjにしか定義されていませんが、call()の第一引数にobj1を渡すことで、メソッド内のthisobj1を指すようになります。その結果、obj1firstNamelastNameが使われ、「Welcome John Shaw」という文字列が生成されるのです。

このようにcall()apply()bind()を活用すれば、コードの重複を避けながら、既存のメソッドをさまざまなオブジェクトで再利用できます。類似の構造を持つ複数のオブジェクトを扱う際や、配列のような配列風オブジェクトに配列メソッドを適用したい場合など、実務でも頻繁に使われる重要な概念なので、しっかり理解しておきましょう。

  1. JavaScriptのNumber()関数とは?使い方とサンプルコードを解説

    JavaScriptのNumber()関数は、引数として渡された値やオブジェクトを、それに対応する数値へ変換するための関数です。真偽値や文字列型の数字、さらにはDateオブジェクトなども数値に変換できるため、データ型の変換処理において非常に便利な組み込み関数の一つです。例えば、Number(true)は「1」、Number(false)は「0」を返します。また、数字のみで構成された文字列「149」を渡せば数値の149に変換され、new Date()で生成した日付オブジェクトを渡すと、1970年1月1日からの経過ミリ秒数が返されます。以下に、Number()関数の動作を確認できるサンプルコードを

  2. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに