JavaScript/Reflect
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"
この例では、Proxy
の get
トラップ内で Reflect.get
を使用し、デフォルトのプロパティ取得動作を再現しています。