Reflect

編集

Reflect は、JavaScript においてオブジェクト操作を標準化したユーティリティを提供するビルトインオブジェクトです。Proxy オブジェクトとともに使用されることが多く、Reflect のメソッドは、オブジェクトのプロパティ操作や関数の呼び出しなどをより簡潔かつ一貫して扱うことを目的としています。

Reflect 自体は関数ではなく、インスタンス化もできません。

構文

編集
Reflect.method(target, ...arguments)
  • method: 実行したい Reflect のメソッド。
  • target: 操作対象のオブジェクト。
  • arguments: 操作に必要な追加の引数。

説明

編集

Reflect は以下のメソッドを提供し、オブジェクトの操作に統一された方法を提供します。

メソッド 説明
Reflect.apply(target, thisArgument, argumentsList) 指定された this 値と引数を使用して関数を呼び出します。
Reflect.construct(target, argumentsList[, newTarget]) new キーワードと同じ動作を行い、インスタンスを生成します。
Reflect.defineProperty(target, property, descriptor) オブジェクトに新しいプロパティを定義します。
Reflect.deleteProperty(target, property) 指定されたプロパティを削除します(delete と同等)。
Reflect.get(target, property[, receiver]) 指定されたプロパティの値を取得します。
Reflect.set(target, property, value[, receiver]) 指定されたプロパティに値を設定します。
Reflect.has(target, property) プロパティが存在するかどうかを確認します(in 演算子と同等)。
Reflect.ownKeys(target) オブジェクトのすべてのキー(文字列およびシンボル)を返します。
その他 Reflect.getPrototypeOf, Reflect.setPrototypeOf, Reflect.isExtensible, Reflect.preventExtensions などのメソッドがあります。

使用例

編集

メソッド呼び出し

編集
const sum = (a, b) => a + b;
const result = Reflect.apply(sum, null, [10, 20]);
console.log(result); // 30

この例では、Reflect.apply を使用して関数を呼び出しています。

プロパティの取得

編集
const obj = { name: 'Alice' };
const value = Reflect.get(obj, 'name');
console.log(value); // 'Alice'

Reflect.get を使用してプロパティ値を取得します。

プロパティの設定

編集
const obj = { age: 25 };
Reflect.set(obj, 'age', 30);
console.log(obj.age); // 30

この例では、Reflect.set を使用してオブジェクトのプロパティ値を変更しています。

プロパティの削除

編集
const obj = { key: 'value' };
Reflect.deleteProperty(obj, 'key');
console.log(obj.key); // undefined

Reflect.deleteProperty を使用してプロパティを削除します。

全キーの取得

編集
const obj = { a: 1, [Symbol('b')]: 2 };
console.log(Reflect.ownKeys(obj)); // ['a', Symbol(b)]

Reflect.ownKeys を使用してオブジェクトのキーをすべて取得します。

特徴と注意点

編集
  • 一貫性: Reflect を使用すると、通常の構文やメソッドで行う操作が統一的に扱えます。
  • Proxyとの併用: Proxy のトラップの内部実装で、Reflect を用いることで元の動作を簡単に再現できます。
  • 明示的なエラー: 通常の構文ではエラーをスローする代わりに false を返す場面があります(例: Reflect.defineProperty)。

使用例: Proxy と Reflect

編集
const target = { name: 'Bob' };
const handler = {
  get(target, property, receiver) {
    console.log(<code>Accessing property: ${property}</code>);
    return Reflect.get(target, property, receiver);
  }
};
const proxy = new Proxy(target, handler);

console.log(proxy.name); // "Accessing property: name", "Bob"

この例では、Proxyget トラップ内で Reflect.get を使用し、デフォルトのプロパティ取得動作を再現しています。

関連項目

編集

参考

編集