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

浏览器兼容性

另见