JavaScript/Reflect

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

Reflect

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

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

構文

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

説明

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

静的プロパティ
名称 説明
Reflect.apply() 指定された引数を持つターゲット関数を呼び出します。
Reflect.construct() 指定された引数を持つターゲットコンストラクタを new 演算子のように呼び出します。
Reflect.defineProperty() オブジェクトに新しいプロパティを定義するか、既存のプロパティを変更します。
Reflect.deleteProperty() オブジェクトからプロパティを削除します。
Reflect.getOwnPropertyDescriptor() オブジェクトの特定のプロパティのプロパティ記述子を返します。
Reflect.getPrototypeOf() 指定されたオブジェクトのプロトタイプ (内部 [[Prototype]] プロパティの値) を返します。
Reflect.get() オブジェクトからプロパティの値を取得します。
Reflect.has() オブジェクトがプロパティを持っているかどうかを示すブール値を返します。
Reflect.isExtensible() オブジェクトが拡張可能かどうかを判断します (新しいプロパティを追加できるかどうか)。
Reflect.ownKeys() オブジェクトの自身のプロパティキーの配列を返します。
Reflect.preventExtensions() オブジェクトの拡張を防止します。
Reflect.setPrototypeOf() 指定されたオブジェクトのプロトタイプ (内部 [[Prototype]] プロパティ) を設定します。
Reflect.set() オブジェクトにプロパティを設定します。
Reflect [ Symbol.toStringTag ] Object.prototype.toString()メソッドで使用される、オブジェクトの既定の文字列表現を指定するシンボルです。Reflectオブジェクトの場合、"Reflect"という文字列を返します。

使用例

メソッド呼び出し

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 を使用し、デフォルトのプロパティ取得動作を再現しています。

プロパティ

Reflectには、以下のようなプロパティがあります。

Reflect.apply()

構文
Reflect.apply(target, thisArgument, argumentsList)

指定した関数を、指定した this 値および引数リストで呼び出します。

使用例
const result = Reflect.apply(Math.max, undefined, [1, 2, 3]);
console.log(result); // 3

Reflect.construct()

構文
Reflect.construct(target, argumentsList[, newTarget])

指定したコンストラクタを使用して新しいインスタンスを作成します。

使用例
class Example {}
const obj = Reflect.construct(Example, []);
console.log(obj instanceof Example); // true

Reflect.defineProperty()

構文
Reflect.defineProperty(target, propertyKey, attributes)

オブジェクトにプロパティを定義します。成功時に true を返します。

使用例
const obj = {};
Reflect.defineProperty(obj, 'key', { value: 42 });
console.log(obj.key); // 42

Reflect.deleteProperty()

構文
Reflect.deleteProperty(target, propertyKey)

指定したプロパティを削除します。成功時に true を返します。

使用例
const obj = { key: 42 };
Reflect.deleteProperty(obj, 'key');
console.log('key' in obj); // false

Reflect.get()

構文
Reflect.get(target, propertyKey[, receiver])

指定したオブジェクトからプロパティの値を取得します。

使用例
const obj = { key: 42 };
console.log(Reflect.get(obj, 'key')); // 42

Reflect.getOwnPropertyDescriptor()

構文
Reflect.getOwnPropertyDescriptor(target, propertyKey)

指定したプロパティの記述子を取得します。

使用例
const obj = { key: 42 };
const descriptor = Reflect.getOwnPropertyDescriptor(obj, 'key');
console.log(descriptor.value); // 42

Reflect.getPrototypeOf()

構文
Reflect.getPrototypeOf(target)

指定したオブジェクトのプロトタイプを取得します。

使用例
const obj = {};
console.log(Reflect.getPrototypeOf(obj) === Object.prototype); // true

Reflect.has()

構文
Reflect.has(target, propertyKey)

指定したプロパティがオブジェクトに存在するかを確認します。

使用例
const obj = { key: 42 };
console.log(Reflect.has(obj, 'key')); // true

Reflect.isExtensible()

構文
Reflect.isExtensible(target)

指定したオブジェクトが拡張可能かを確認します。

使用例
const obj = {};
console.log(Reflect.isExtensible(obj)); // true

Reflect.ownKeys()

構文
Reflect.ownKeys(target)

指定したオブジェクトのすべてのプロパティキーを取得します(文字列キーとシンボルキーを含む)。

使用例
const obj = { key: 42, [Symbol('sym')]: 'value' };
console.log(Reflect.ownKeys(obj)); // ['key', Symbol(sym)]

Reflect.preventExtensions()

構文
Reflect.preventExtensions(target)

オブジェクトの拡張を防止します。成功時に true を返します。

使用例
const obj = {};
Reflect.preventExtensions(obj);
console.log(Reflect.isExtensible(obj)); // false

Reflect.set()

構文
Reflect.set(target, propertyKey, value[, receiver])

指定したプロパティに値を設定します。成功時に true を返します。

使用例
const obj = {};
Reflect.set(obj, 'key', 42);
console.log(obj.key); // 42

Reflect.setPrototypeOf()

構文
Reflect.setPrototypeOf(target, prototype)

指定したオブジェクトのプロトタイプを設定します。成功時に true を返します。

使用例
const obj = {};
Reflect.setPrototypeOf(obj, Array.prototype);
console.log(obj instanceof Array); // true

関連項目

参考

カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension