Reflect.set()

Reflect.set() 静态方法类似于属性访问器赋值语法,但它是一个函数。

试一试

语法

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

参数

target

要设置属性的目标对象。

propertyKey

要设置的属性的名称。

value

要设置的值。

receiver 可选

为对targetpropertyKey的 setter 的调用提供的this的值。如果提供并且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 语言规范
# sec-reflect.set

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅