JavaScript/Reflect/apply

カテゴリ:Book:JavaScript#Reflect/apply%20

Reflect.apply() は、指定された関数を特定の this 値と引数で呼び出すメソッドです。このメソッドは Function.prototype.apply() と同様の機能を提供しますが、より柔軟な方法で関数を呼び出すことができます[1]

構文

Reflect.apply(target, thisArgument, argumentsList)
  • target: 呼び出す関数。
  • thisArgument: 関数内で this として使用される値。
  • argumentsList: 関数に渡される引数の配列またはその他の配列風オブジェクト。

基本的な関数呼び出しの例

以下のプログラムは、Reflect.apply() を使用して関数を呼び出す基本的な例です。

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

console.log(Reflect.apply(sum, null, [1, 2])); // 3

このプログラムでは、Reflect.apply() を使用して sum 関数を呼び出しています。this の値は null で、引数として [1, 2] を渡しています。結果として 3 が返されます。

thisArgument を指定した関数呼び出しの例

以下のプログラムは、Reflect.apply() を使用して特定の this 値で関数を呼び出す例です。

const person = {
  name: 'Alice',
  greet: function(greeting) {
    return `${greeting}, ${this.name}!`;
  }
};

console.log(Reflect.apply(person.greet, person, ['Hello'])); // "Hello, Alice!"
console.log(Reflect.apply(person.greet, { name: 'Bob' }, ['Hi'])); // "Hi, Bob!"

このプログラムでは、Reflect.apply() を使用して person.greet 関数を呼び出しています。最初の呼び出しでは this の値として person オブジェクトを使用し、2番目の呼び出しでは { name: 'Bob' } を使用しています。

組み込みメソッドへの適用例

以下のプログラムは、Reflect.apply() を使用して組み込みメソッドを呼び出す例です。

const numbers = [1, 2, 3, 4, 5];

// Math.max() に配列の要素を適用する
const max = Reflect.apply(Math.max, null, numbers);
console.log(max); // 5

// Array.prototype.push を別の配列に適用する
const array1 = [1, 2, 3];
const array2 = [4, 5];
Reflect.apply(Array.prototype.push, array1, array2);
console.log(array1); // [1, 2, 3, 4, 5]

このプログラムでは、Reflect.apply() を使用して Math.max() メソッドを配列全体に適用しています。また、Array.prototype.push メソッドを array1 に適用し、array2 の要素を引数として渡しています。

注意点

  • 関数オブジェクト: target パラメータは呼び出し可能なオブジェクトでなければなりません。そうでない場合は TypeError が発生します。
  • パフォーマンス: Function.prototype.apply() と比較して、Reflect.apply() はプロキシと組み合わせた場合にいくつかの利点があります。
  • 非破壊的: Function.prototype のメソッドとは異なり、Reflect のメソッドはオブジェクトのプロトタイプを変更しません。

脚註

  1. これは、特に関数の適用を制御したい場合や、Function.prototype のメソッドに依存したくない場合に便利です。

外部リンク

カテゴリ:Book:JavaScript#Reflect/apply%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension