JavaScript/Reflect/construct
表示
< JavaScript | Reflect
Reflect.construct() は、new 演算子と同様にコンストラクタ関数を呼び出して新しいオブジェクトを作成するメソッドです。このメソッドは、通常の new 演算子よりも柔軟な方法でコンストラクタ関数を呼び出すことができます[1]。
構文
[編集]Reflect.construct(target, argumentsList[, newTarget])
target: 呼び出すコンストラクタ関数。argumentsList: コンストラクタに渡す引数の配列またはその他の配列風オブジェクト。newTarget: オプション。新しいオブジェクトのプロトタイプを決定するコンストラクタ関数。指定しない場合はtargetが使用されます。
例
[編集]基本的な使用例
[編集]以下のプログラムは、Reflect.construct() を使用してオブジェクトを作成する基本的な例です。
function Person(name) { this.name = name; } // new演算子を使用する場合 const person1 = new Person('Alice'); // Reflect.constructを使用する場合 const person2 = Reflect.construct(Person, ['Bob']); console.log(person1.name); // "Alice" console.log(person2.name); // "Bob"
このプログラムでは、Reflect.construct() を使用して Person コンストラクタを呼び出し、新しい Person オブジェクトを作成しています。結果は new 演算子を使用した場合と同じです。
newTarget パラメータを使用した例
[編集]以下のプログラムは、newTarget パラメータを使用してプロトタイプチェーンを操作する例です。
function Person(name) { this.name = name; } function Employee(name, title) { Person.call(this, name); this.title = title; } Employee.prototype.getRole = function() { return this.title; }; // Person コンストラクタを呼び出すが、Employee のプロトタイプを使用 const person = Reflect.construct(Person, ['John'], Employee); console.log(person instanceof Person); // false console.log(person instanceof Employee); // true console.log(person.name); // "John" console.log(person.getRole); // [Function]
このプログラムでは、Reflect.construct() を使用して Person コンストラクタを呼び出していますが、newTarget パラメータに Employee を指定しています。これにより、作成されたオブジェクトは Employee.prototype を継承しています。
組み込みオブジェクトの構築例
[編集]以下のプログラムは、Reflect.construct() を使用して組み込みオブジェクトを構築する例です。
// 配列を作成 const array = Reflect.construct(Array, [1, 2, 3]); console.log(array); // [1, 2, 3] // 日付オブジェクトを作成 const date = Reflect.construct(Date, [2023, 0, 1]); // 2023年1月1日 console.log(date.getFullYear()); // 2023 // 正規表現オブジェクトを作成 const regex = Reflect.construct(RegExp, ['^hello', 'i']); console.log(regex.test('Hello World')); // true
このプログラムでは、Reflect.construct() を使用して Array、Date、RegExp などの組み込みコンストラクタを呼び出し、新しいオブジェクトを作成しています。
注意点
[編集]- コンストラクタ関数:
targetパラメータはコンストラクタ関数である必要があります。そうでない場合はTypeErrorが発生します。 - new.target:
newTargetパラメータを指定すると、コンストラクタ内のnew.targetの値が変更されます。 - プロキシ連携:
Reflect.construct()はProxyのconstructトラップと連携するために設計されています。 - ES2015+: このメソッドは ECMAScript 2015 (ES6) で導入されました。
脚註
[編集]- ^ このメソッドは特にプロキシハンドラーの
constructトラップと連携して使用される場合に便利です。
外部リンク
[編集]