Reflect.defineProperty()
Базовый Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.
Статический метод Reflect.defineProperty() похож на Object.defineProperty(), но возвращает Boolean.
Попробовать
const object = {};
if (Reflect.defineProperty(object, "foo", { value: 42 })) {
console.log("foo created!");
// Expected output: "foo created!"
} else {
console.log("problem creating foo");
}
console.log(object.foo);
// Expected output: 42
Синтаксис
Reflect.defineProperty(target, propertyKey, attributes)
Параметры
-
target - Целевой объект, на котором должно быть определено свойство.
-
propertyKey - Имя свойства, которое должно быть определено или изменено.
-
attributes - Атрибуты для определяемого или изменяемого свойства.
Возвращаемое значение
Логическое значение, указывающее, было ли свойство успешно определено.
Исключения
-
TypeError - Вызывается, если
targetилиattributesне является объектом.
Описание
Reflect.defineProperty() предоставляет рефлексивную семантику определения собственного свойства объекта. На самом низком уровне определение свойства возвращает логическое значение (как в случае с обработчиком прокси). Object.defineProperty() предоставляет почти ту же семантику, но вызывает TypeError, если статус равен false (операция была неуспешной), в то время как Reflect.defineProperty() напрямую возвращает статус.
Многие встроенные операции также определяют собственные свойства объектов. Наиболее существенное различие между определением свойств и их установкой заключается в том, что сеттеры не вызываются. Например, поля классов напрямую определяют свойства экземпляра без вызова сеттеров.
class B extends class A {
set a(v) {
console.log("Setter called");
}
} {
a = 1; // Nothing logged
}
Reflect.defineProperty() вызывает [[DefineOwnProperty]] внутренний метод объекта из target.
Примеры
Использование Reflect.defineProperty()
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7
Проверка успешности определения свойства
С помощью Object.defineProperty(), который возвращает объект в случае успеха или вызывает TypeError в противном случае, вы бы использовали блок try...catch для перехвата любой ошибки, возникшей при определении свойства.
Поскольку Reflect.defineProperty() возвращает логический статус успеха, вы можете просто использовать здесь блок if...else:
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
defineProperty |
49 |
12 |
42 |
36 |
10 |
49 |
42 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty