Reflect.set()

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

Reflect.set() 靜態方法類似於屬性訪問器賦值語法,但它是一個函式。

試一試

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

console.log(object.foo);
// Expected output: 42

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

console.log(array[2]);
// Expected output: "goose"

語法

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

引數

目標

要設定屬性的目標物件。

propertyKey

要設定的屬性名稱。

value

要設定的值。

receiver 可選

為在target上呼叫propertyKey的 setter 提供的值。如果提供了該值且target沒有為propertyKey設定 setter,則屬性將被設定在receiver上。

返回值

一個Boolean值,指示設定屬性是否成功。

異常

TypeError

如果 target 不是一個物件,則丟擲。

描述

Reflect.set() 提供了屬性訪問的反射語義。也就是說,Reflect.set(target, propertyKey, value, receiver) 在語義上等同於

js
target[propertyKey] = value;

請注意,在正常的屬性訪問中,targetreceiver 將是可觀察到的同一個物件。

Reflect.set() 呼叫 target[[Set]] 物件內部方法

示例

使用 Reflect.set()

js
// Object
const obj = {};
Reflect.set(obj, "prop", "value"); // true
obj.prop; // "value"

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

// It can truncate an array.
Reflect.set(arr, "length", 1); // true
arr; // ["duck"]

// With just one argument, propertyKey and value are "undefined".
Reflect.set(obj); // true
Reflect.getOwnPropertyDescriptor(obj, "undefined");
// { value: undefined, writable: true, enumerable: true, configurable: true }

不同的 target 和 receiver

targetreceiver 不同時,Reflect.set 將使用 target 的屬性描述符(以查詢 setter 或確定屬性是否可寫),但會在 receiver 上設定屬性。

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

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

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

規範

規範
ECMAScript® 2026 語言規範
# sec-reflect.set

瀏覽器相容性

另見