Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
Статический метод Object.defineProperty() определяет новое или изменяет существующее свойство объекта и возвращает этот объект.
Объект, на котором определяется свойство.
propСтрока или Symbol с ключом определяемого или изменяемого свойства.
descriptorДескриптор определяемого или изменяемого свойства.
Этот метод позволяет точно добавлять или изменять свойства объекта. Обычное добавление свойств через присваивание создаёт свойства, которые можно увидеть через перечисление свойств (с помощью цикла for...in или метода Object.keys), чьи значения могут быть изменены и которые могут быть удалены. Этот же метод позволяет настроить эти дополнительные детали свойства.
Дескрипторы свойств, присутствующие в объектах, бывают двух основных типов: дескрипторы данных и дескрипторы доступа. Дескриптор данных — это свойство, имеющее значение, которое может быть (а может и не быть) записываемым. Дескриптор доступа — это свойство, описываемое парой функций — геттером и сеттером. Дескриптор может быть только чем-то одним из этих двух типов; он не может быть одновременно обоими.
И дескриптор данных, и дескриптор доступа являются объектами. Они обладают следующими обязательными ключами:
configurableРавен true только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта. Значение по умолчанию установлено в false.
enumerableРавен true только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта. Значение по умолчанию установлено в false.
Дескриптор данных также может содержать следующие дополнительные ключи:
valueЗначение, ассоциированное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т.д.). Значение по умолчанию установлено в undefined.
writableРавен true только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью оператора присваивания. Значение по умолчанию установлено в false.
Дескриптор доступа также может содержать следующие дополнительные ключи:
getФункция, используемая как геттер свойства, либо undefined, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства. Значение по умолчанию установлено в undefined.
setФункция, используемая как сеттер свойства, либо undefined, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству. Значение по умолчанию установлено в undefined.
Имейте в виду, что эти ключи не обязательно должны принадлежать самому дескриптору свойства, если они унаследованы, они так же будут приниматься во внимание. Для сохранения этих ключей по умолчанию неизменными, вы можете заранее заморозить Object.prototype, явно определив все ключи, либо установить свойство Object.prototype.__proto__ в null.
Если указанное свойство не существует в объекте, метод Object.defineProperty() создаст новое свойство по переданному описанию. Поля в дескрипторе могут быть опущены, в этом случае их значения будут значениями по умолчанию. Все логические поля будут по умолчанию установлены в false. Поля value, get и set по умолчанию будут установлены в undefined. Свойство, определённое без атрибутов get/set/value/writable называется «общим», а дескриптор данных — «типовым».
Если свойство уже существует, метод Object.defineProperty() попытается изменить свойство в соответствии со значениями в дескрипторе и текущим состоянием объекта.
Если у старого дескриптора атрибут configurable был установлен в false, то свойство является ненастраиваемым. Нельзя изменять атрибуты ненастраиваемых свойств, а также нельзя изменять тип дескриптора. Для свойств данных с writable: true можно изменять значение и изменять атрибут writable с true на false. При попытке изменить ненастраиваемые атрибуты свойств возникает ошибка TypeError. Исключения составляют атрибуты value и writable (если это разрешено) и если новое значение совпадает с исходным значением свойства данных.
Если свойство является настраиваемым, то установка атрибуту значения undefined равно его удалению. Например, если o.k это свойство доступа, то вызов Object.defineProperty(o, "k", { set: undefined }) удалит сеттер, оставив у k только геттер, то есть сделает его доступным только для чтения. Если атрибут отсутствует в новом дескрипторе, то берётся значение атрибута из старого дескриптора (то есть не происходит неявного переопределения на undefined). Можно переключаться между разными типами дескрипторов (свойства данных или доступа). Например, если новый дескриптор — это дескриптор данных (с value или writable), то атрибуты get и set оригинального дескриптора будут удалены.
Если атрибут writable свойства установлен в false, свойство становится «незаписываемым». Ему невозможно будет присвоить новое значение.
Как видно в этом примере, попытка записи в незаписываемое свойство его не изменило, но и исключение так же не было выброшено.
Атрибут enumerable свойства определяет, просматривается ли свойство в цикле for...in и методом Object.keys() или нет.
Атрибут configurable одновременно контролирует, может ли свойство быть удалено из объекта и могут ли быть изменены его атрибуты (кроме контроля изменения атрибута writable).
Если бы атрибут configurable объекта o.a был установлен в true, никакие ошибки не были бы выброшены и в конце свойство было бы удалено.
Важно понимать, как устанавливаются значения по умолчанию атрибутам свойств. Часто существует разница между простым назначением значения посредством точечной нотации и использованием метода Object.defineProperty(), что и показывает пример ниже.
Пример ниже показывает, как реализовать самоархивирующийся объект. При установке свойства temperature в массив archive попадает запись журнала.
| ECMAScript® 2027 Language Specification # sec-object.defineproperty |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 24 мар. 2025 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.