Reflect.defineProperty()
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2016年9月以降、すべてのブラウザーで利用可能です。
Reflect.defineProperty() は静的メソッドで、Object.defineProperty() と似ていますが、論理値 (Boolean) を返します。
試してみましょう
const object = {};
if (Reflect.defineProperty(object, "foo", { value: 42 })) {
console.log("foo created!");
// 予想される結果: "foo created!"
} else {
console.log("problem creating foo");
}
console.log(object.foo);
// 予想される結果: 42
構文
Reflect.defineProperty(target, propertyKey, attributes)
引数
target-
プロパティを定義する対象のオブジェクトです。
propertyKey-
定義または修正をするプロパティ名です。
attributes-
定義または修正されているプロパティのための属性です。
返値
プロパティの定義に成功したかどうかを示す論理値です。
例外
TypeError-
targetがオブジェクトではなかった場合。
解説
Reflect.defineProperty() は、オブジェクトに独自のプロパティを定義する反射的な意味付けを指定します。ごく基本的なレベルでは、プロパティの定義は論理値を返します(プロキシーハンドラーの場合と同様です)。Object.defineProperty() はほぼ同じ意味づけを提供しますが、結果が false(操作が失敗した)の場合、TypeError が発生します。一方、Reflect.defineProperty() は結果を直接返します。
多くの組み込み操作もオブジェクト上に独自のプロパティを定義することができます。プロパティを定義することと設定することの最も重要な違いは、セッターが呼び出されない点です。例えば、クラスフィールドは、セッターを呼び出さずにインスタンスに直接プロパティを定義します。
class B extends class A {
set a(v) {
console.log("Setter called");
}
} {
a = 1; // 何もログ出力されない
}
Reflect.defineProperty() は、target の [[DefineOwnProperty]] オブジェクト内部メソッド を呼び出します。
例
>Reflect.defineProperty() の使用
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7
プロパティ定義が成功したかチェックする
成功してオブジェクトを返すか、失敗して TypeError をスローする Object.defineProperty() を使う場合、プロパティの定義中に発生する何らかの例外を捕捉するには、try...catch ブロックを使用します。
Reflect.defineProperty は真偽値の成功結果を返すので、if...else ブロックを使用することができます。
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-reflect.defineproperty> |