このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Reflect.setPrototypeOf()

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。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)

引数

target

プロトタイプを設定する対象のオブジェクトです。

prototype

オブジェクトの新しいプロトタイプ (オブジェクトまたは null) です。

返値

プロトタイプが正常に設定されたかどうかを示す論理値 (Boolean) です。

例外

TypeError

target がオブジェクトではない場合、または prototype がオブジェクトでも null でもない場合。

解説

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

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-reflect.setprototypeof

ブラウザーの互換性

関連情報