Reflect.setPrototypeOf()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
Reflect.setPrototypeOf() は静的メソッドで、Object.setPrototypeOf() と同様ですが、論理値 (Boolean) を返す点が異なります。指定されたオブジェクトのプロトタイプ(すなわち内部の [[Prototype]] プロパティ)を設定します。
試してみましょう
const object1 = {};
console.log(Reflect.setPrototypeOf(object1, Object.prototype));
// 予想される結果: true
console.log(Reflect.setPrototypeOf(object1, null));
// 予想される結果: true
const object2 = {};
console.log(Reflect.setPrototypeOf(Object.freeze(object2), null));
// 予想される結果: false
構文
js
Reflect.setPrototypeOf(target, prototype)
引数
返値
プロトタイプが正常に設定されたかどうかを示す論理値 (Boolean) です。
例外
解説
Reflect.setPrototypeOf() は、オブジェクトのプロトタイプを設定する反射的な意味づけを提供します。ごく基本的なレベルでは、プロトタイプの設定は論理値を返します(プロキシハンドラーの場合と同様です)。Object.setPrototypeOf() はほぼ同じ意味づけを提供しますが、結果が false(操作が失敗した)の場合、TypeError が発生します。一方、Reflect.setPrototypeOf() は結果を直接返します。
Reflect.setPrototypeOf() は、target の [[SetPrototypeOf]] オブジェクト内部メソッド を呼び出します。
例
>Reflect.setPrototypeOf() の使用
js
Reflect.setPrototypeOf({}, Object.prototype); // true
// オブジェクトの [[Prototype]] は null に変更できる。
Reflect.setPrototypeOf({}, null); // true
// 対象が拡張できない場合、false を返す。
Reflect.setPrototypeOf(Object.freeze({}), null); // false
// プロトタイプチェーンが循環する場合、false を返す。
const target = {};
const proto = Object.create(target);
Reflect.setPrototypeOf(target, proto); // false
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-reflect.setprototypeof> |