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

View in English Always switch to English

Reflect.set()

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.set() は静的メソッドで、プロパティアクセサーおよび代入構文に似ていますが、関数として実装されています。

試してみましょう

const object = {};
Reflect.set(object, "foo", 42);

console.log(object.foo);
// 予想される結果: 42

const array = ["duck", "duck", "duck"];
Reflect.set(array, 2, "goose");

console.log(array[2]);
// 予想される結果: "goose"

構文

js
Reflect.set(target, propertyKey, value)
Reflect.set(target, propertyKey, value, receiver)

引数

target

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

propertyKey

設定するプロパティ名。

value

設定する値。

receiver 省略可

targetpropertyKeyに対するセッター呼び出しに指定されるthisの値です。指定され、かつtargetpropertyKeyのセッターを持たない場合、代わりにreceiverにプロパティが設定されます。

返値

プロパティが成功裏に設定できたかどうかを示す論理値 (Boolean)。

例外

TypeError

target がオブジェクトではない場合に発生します。

解説

Reflect.set() は、プロパティアクセス の反射的意味づけを提供します。つまり、Reflect.set(target, propertyKey, value, receiver) は意味づけ的に次のものと同等です。

js
target[propertyKey] = value;

通常のプロパティアクセスでは、targetreceiver は明らかに同一のオブジェクトであることに注意してください。

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

Reflect.set() の使用

js
// オブジェクト
const obj = {};
Reflect.set(obj, "prop", "value"); // true
obj.prop; // "value"

// 配列
const arr = ["duck", "duck", "duck"];
Reflect.set(arr, 2, "goose"); // true
arr[2]; // "goose"

// 配列を切り詰められる。
Reflect.set(arr, "length", 1); // true
arr; // ["duck"]

// 引数が1つだけだと、プロパティキーと値は "undefined" になる。
Reflect.set(obj); // true
Reflect.getOwnPropertyDescriptor(obj, "undefined");
// { value: undefined, writable: true, enumerable: true, configurable: true }

target と receiver の違い

targetreceiver が異なる場合、Reflect.settarget のプロパティ記述子を使用します(セッターを探したり、プロパティが書き込み可能かどうかの判定をしたりするため)。ただし、プロパティの設定は receiver に対して行います。

js
const target = {};
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target は {}; receiver は { a: 2 }

const target = { a: 1 };
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target は { a: 1 }; receiver は { a: 2 }

const target = {
  set a(v) {
    this.b = v;
  },
};
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target は { a: [Setter] }; receiver は { b: 2 }

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-reflect.set

ブラウザーの互換性

関連情報