Spec-Zone.ru › JavaScript

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
}

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-reflect.defineproperty

Совместимость с браузерами

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

Смотрите также

  • Полифилл Reflect.defineProperty в core-js
  • Reflect
  • Object.defineProperty()
  • handler.defineProperty()

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API