8.1 メソッド call
JavaScriptのcall
、bind
、apply
メソッドは、関数の実行コンテキストを管理する上で重要な役割を果たしていて、関数を呼び出すときにthis
の値を設定することができるんだよね。これらのメソッドは特にオブジェクトや関数型プログラミングを扱う際に便利で、コードを柔軟に管理するための強力な道具を提供してくれるんだ。それぞれの詳細と使い方の例を見ていこう。
call
メソッドは、指定されたthis
の値とカンマ区切りの引数を使って関数を呼び出すよ。これで、関数が実行されるコンテキストを明示的に指定できるんだ。
シンタックス:
func.call(thisArg, arg1, arg2 ...);
例:
この例では、greet
関数がperson
というコンテキストで呼び出され、そのためにperson
オブジェクトのname
プロパティを使えるようになるんだ。
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]);
例:
この例は前のと似てるけど、引数が配列として渡されてるんだ。
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
オブジェクトのコンテキストで実行されるようになるんだ。
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
オブジェクトのコンテキストで呼び出され、name
とprice
のプロパティを継承できるようになってるんだよ。
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
に個別の引数として渡されるんだ。
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
の値を正しく取得できるようになっているんだ。
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
オブジェクトに適用されるよ。
function printArguments() {
Array.prototype.forEach.call(arguments, function(item) {
console.log(item);
});
}
printArguments(1, 2, 3); // Output: 1, 2, 3
applyを使った配列の結合の例:
ここでは、apply
を使ってpush
メソッドを使って2つの配列を結合してるんだ。
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を固定した状態で作成されるよ。
function multiply(a, b) {
return a * b;
}
const double = multiply.bind(null, 2);
console.log(double(5)); // Output: 10
GO TO FULL VERSION