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;
请注意,在正常的属性访问中,target 和 receiver 将是可观察到的同一个对象。
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
当 target 和 receiver 不同时,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 |
浏览器兼容性
加载中…