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

View in English Always switch to English

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

構文

js
Reflect.defineProperty(target, propertyKey, attributes)

引数

target

プロパティを定義する対象のオブジェクトです。

propertyKey

定義または修正をするプロパティ名です。

attributes

定義または修正されているプロパティのための属性です。

返値

プロパティの定義に成功したかどうかを示す論理値です。

例外

TypeError

target がオブジェクトではなかった場合。

解説

Reflect.defineProperty() は、オブジェクトに独自のプロパティを定義する反射的な意味付けを指定します。ごく基本的なレベルでは、プロパティの定義は論理値を返します(プロキシーハンドラーの場合と同様です)。Object.defineProperty() はほぼ同じ意味づけを提供しますが、結果が false(操作が失敗した)の場合、TypeError が発生します。一方、Reflect.defineProperty() は結果を直接返します。

多くの組み込み操作もオブジェクト上に独自のプロパティを定義することができます。プロパティを定義することと設定することの最も重要な違いは、セッターが呼び出されない点です。例えば、クラスフィールドは、セッターを呼び出さずにインスタンスに直接プロパティを定義します。

js
class B extends class A {
  set a(v) {
    console.log("Setter called");
  }
} {
  a = 1; // 何もログ出力されない
}

Reflect.defineProperty() は、target[[DefineOwnProperty]] オブジェクト内部メソッド を呼び出します。

Reflect.defineProperty() の使用

js
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7

プロパティ定義が成功したかチェックする

成功してオブジェクトを返すか、失敗して TypeError をスローする Object.defineProperty() を使う場合、プロパティの定義中に発生する何らかの例外を捕捉するには、try...catch ブロックを使用します。

Reflect.defineProperty は真偽値の成功結果を返すので、if...else ブロックを使用することができます。

js
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}

仕様書

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

ブラウザーの互換性

関連情報