CodeGym /Javaコース /Frontend SELF JA /メソッド call, bind, apply

メソッド call, bind, apply

Frontend SELF JA
レベル 44 , レッスン 3
使用可能

8.1 メソッド call

JavaScriptのcallbindapplyメソッドは、関数の実行コンテキストを管理する上で重要な役割を果たしていて、関数を呼び出すときにthisの値を設定することができるんだよね。これらのメソッドは特にオブジェクトや関数型プログラミングを扱う際に便利で、コードを柔軟に管理するための強力な道具を提供してくれるんだ。それぞれの詳細と使い方の例を見ていこう。

callメソッドは、指定されたthisの値とカンマ区切りの引数を使って関数を呼び出すよ。これで、関数が実行されるコンテキストを明示的に指定できるんだ。

シンタックス:

    
      func.call(thisArg, arg1, arg2 ...);
    
  

例:

この例では、greet関数がpersonというコンテキストで呼び出され、そのためにpersonオブジェクトのnameプロパティを使えるようになるんだ。

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      greet.call(person, 'Hello', '!'); // Output: Hello, John!
    
  

8.2 メソッド apply

applyメソッドはcallと似ているけど、引数を配列として渡すんだ。関数に渡したい引数が配列としてあるときに便利なんだよね。

シンタックス:

    
      func.apply(thisArg, [argsArray]);
    
  

例:

この例は前のと似てるけど、引数が配列として渡されてるんだ。

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      greet.apply(person, ['Hello', '!']); // Output: Hello, John!
    
  

8.3 メソッド bind

bindメソッドは、新しい関数を作成して、呼び出されたときにthisの値を設定するんだ。bindに渡された引数は新しい関数の中で固定されるんだ。つまり、固定コンテキストの関数を作ることができるんだよ。

シンタックス:

    
      const boundFunc = func.bind(thisArg, arg1, arg2 ...);
    
  

例:

この例では、新しい関数boundGreetが作成され、それが常にpersonオブジェクトのコンテキストで実行されるようになるんだ。

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      const boundGreet = greet.bind(person, 'Hello');
      boundGreet('!'); // Output: Hello, John!
    
  

8.4 メソッドの使い方の詳細な解説

1. callを使ったメソッドの継承:

callメソッドは、あるオブジェクトのメソッドを他のオブジェクトに継承させるのによく使われるよ。これで明示的に継承せずにメソッドやプロパティを借りてくることができるんだ。

この例では、ProductコンストラクタがFoodオブジェクトのコンテキストで呼び出され、namepriceのプロパティを継承できるようになってるんだよ。

JavaScript
    
      function Product(name, price) {
        this.name = name;
        this.price = price;
      }

      function Food(name, price, category) {
        Product.call(this, name, price);
        this.category = category;
      }

      const cheese = new Food('Cheese', 5, 'Dairy');
      console.log(cheese); // Output: Food { name: 'Cheese', price: 5, category: 'Dairy' }
    
  

2. applyを使って配列の引数を渡す:

applyメソッドは、別々のパラメータを受け取る関数に配列の引数を渡したいときに便利なんだ。

ここでは、配列numbersが関数sumに個別の引数として渡されるんだ。

JavaScript
    
      function sum(a, b, c) {
        return a + b + c;
      }

      const numbers = [1, 2, 3];
      console.log(sum.apply(null, numbers)); // Output: 6
    
  

3. bindを使って固定コンテキストの関数を作成する:

bindメソッドによって、固定されたコンテキストを持つ関数を作成することができるんだ。イベントやコールバックを扱うときに特に便利だよ。

ここでは、getX関数がmoduleオブジェクトにbindを使って結びつけられ、関数を呼び出すときにxの値を正しく取得できるようになっているんだ。

JavaScript
    
      const module = {
        x: 42,
        getX: function() {
          return this.x;
        }
      };

      const unboundGetX = module.getX;
      console.log(unboundGetX()); // Output: undefined

      const boundGetX = unboundGetX.bind(module);
      console.log(boundGetX()); // Output: 42
    
  

8.5 実生活での例

callを使った配列メソッドの借用の例:

この例では、callを使って配列のforEachメソッドがargumentsオブジェクトに適用されるよ。

JavaScript
    
      function printArguments() {
        Array.prototype.forEach.call(arguments, function(item) {
          console.log(item);
        });
      }

      printArguments(1, 2, 3); // Output: 1, 2, 3
    
  

applyを使った配列の結合の例:

ここでは、applyを使ってpushメソッドを使って2つの配列を結合してるんだ。

JavaScript
    
      const array1 = [1, 2, 3];
      const array2 = [4, 5, 6];

      Array.prototype.push.apply(array1, array2);
      console.log(array1); // Output: [1, 2, 3, 4, 5, 6]
    
  

bindを使った部分関数の作成の例:

double関数がbindを使って最初の引数2を固定した状態で作成されるよ。

JavaScript
    
      function multiply(a, b) {
        return a * b;
      }

      const double = multiply.bind(null, 2);
      console.log(double(5)); // Output: 10
    
  
1
Опрос
CRUDとAPIの使い方,  44 уровень,  3 лекция
недоступен
CRUDとAPIの使い方
CRUDとAPIの使い方
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION