JavaScript/Reflect/construct

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

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() を使用して ArrayDateRegExp などの組み込みコンストラクタを呼び出し、新しいオブジェクトを作成しています。

注意点

  • コンストラクタ関数: target パラメータはコンストラクタ関数である必要があります。そうでない場合は TypeError が発生します。
  • new.target: newTarget パラメータを指定すると、コンストラクタ内の new.target の値が変更されます。
  • プロキシ連携: Reflect.construct()Proxyconstruct トラップと連携するために設計されています。
  • ES2015+: このメソッドは ECMAScript 2015 (ES6) で導入されました。

脚註

  1. このメソッドは特にプロキシハンドラーの construct トラップと連携して使用される場合に便利です。

外部リンク

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