From 1386fed7d38652d5848d315927e7e23a66cffd13 Mon Sep 17 00:00:00 2001
From: Alexey Pyltsyn Метод Этот метод позволяет точно добавлять или изменять свойства объекта. Обычное добавление свойств через присваивание создаёт свойства, которые можно увидеть через перечисление свойств (с помощью цикла {{jsxref("Statements/for...in", "for...in")}} или метода {{jsxref("Object.keys")}}), чьи значения могут быть изменены и которые могут быть {{jsxref("Operators/delete", "удалены", "", 1)}}. Этот же метод позволяет настроить эти дополнительные детали свойства. Если вы хотите посмотреть, как использовать метод Если указанное свойство не существует в объекте, метод Если свойство уже существует, метод При попытке изменить ненастраиваемые атрибуты свойства будет выброшено исключение {{jsxref("Global_Objects/TypeError", "TypeError")}} (кроме случая изменения атрибута Если атрибут Как видно в этом примере, попытка записи в незаписываемое свойство его не изменило, но и исключение так же не было выброшено. Атрибут Атрибут Если бы атрибут Важно понимать, как устанавливаются значения по умолчанию атрибутам свойств. Часто существует разница между простым назначением значения посредством точечной нотации и использованием метода Пример ниже показывает, как реализовать самоархивирующийся объект. При установке свойства {{Compat}} На основе таблицы совместимости Kangax. На массивах возможно переопределить свойство {{jsxref("Array.length", "length")}}, при условии соблюдения обычных ограничений на переопределение. (Изначально свойство {{jsxref("Array.length", "length")}} является ненастраиваемым, неперечисляемым и записываемым. Таким образом, на неизмененном массиве возможно изменить значение свойства {{jsxref("Array.length", "length")}} либо сделать его незаписываемым. Его перечисляемость или настраиваемость изменить нельзя, так же как и его записываемость, если оно сделано не записываемым.) Однако не все браузеры поддерживают такое переопределение. Только Internet Explorer 9 и выше, а так же Firefox 23 и выше, по-видимому, полностью и правильно реализуют переопределение свойства {{jsxref("Array.length", "length")}} массивов. В настоящее время не стоит полагаться на работу переопределения свойства {{jsxref("Array.length", "length")}} массива, или что оно работает определённым образом. И даже если вы можете положиться на это, есть действительно веская причина не делать этого. Реализация метода Сводка
+Сводка
Object.defineProperty() определяет новое или изменяет существующее свойство непосредственно на объекте, возвращая этот объект.Синтаксис
+Синтаксис
-Object.defineProperty(obj, prop, descriptor)Параметры
+Параметры
-objОписание
+Описание
Примеры
+Примеры
Object.defineProperty() с синтаксисом похожим-на-бинарные-флаги, смотрите дополнительные примеры.Пример: создание свойства
+Пример: создание свойства
Object.defineProperty() создаст новое свойство по переданному описанию. Поля в дескрипторе могут быть опущены, в этом случае их значения будут значениями по умолчанию. Все логические поля будут по умолчанию установлены в false. Поля value, get и set по умолчанию будут установлены в {{jsxref("Global_Objects/undefined", "undefined")}}. Свойство, определённое без атрибутов get/set/value/writable называется «общим», а дескриптор данных — «типовым».Пример: изменение свойства
+Пример: изменение свойства
Object.defineProperty() попытается изменить свойство в соответствии со значениями в дескрипторе и текущим состоянием объекта. Если у старого дескриптора атрибут configurable был установлен в false (говорит, что свойство является «ненастраиваемым»), то никакие атрибуты, кроме атрибута writable, не смогут быть изменены. В этом случае так же невозможно переключаться между типами дескрипторов.writable), даже в том случае, если текущее и новое значения идентичны.Атрибут
+writableАтрибут
writablewritable свойства установлен в false, свойство становится «незаписываемым». Ему невозможно будет присвоить новое значение.Атрибут
+enumerableАтрибут
enumerableenumerable свойства определяет, просматривается ли свойство в цикле {{jsxref("Statements/for...in", "for...in")}} и методом {{jsxref("Object.keys()")}} или нет.Атрибут
+configurableАтрибут
configurableconfigurable одновременно контролирует, может ли свойство быть удалено из объекта и могут ли быть изменены его атрибуты (кроме контроля изменения атрибута writable).configurable объекта o.a был установлен в true, никакие ошибки не были бы выброшены и в конце свойство было бы удалено.Пример: добавление свойств и значений по умолчанию
+Пример: добавление свойств и значений по умолчанию
Object.defineProperty(), что и показывает пример ниже.Пример: пользовательские сеттеры и геттеры
+Пример: пользовательские сеттеры и геттеры
temperature в массив archive попадает запись журнала.Спецификации
+Спецификации
@@ -309,12 +309,12 @@ arc.getArchive(); // [{ val: 11 }, { val: 13 }]
-Совместимость с браузерами
+Совместимость с браузерами
Переопределение свойства
+length на объекте ArrayПереопределение свойства
length на объекте ArrayПримечания по Internet Explorer 8
+Примечания по Internet Explorer 8
Object.defineProperty() в Internet Explorer 8 предусматривает, что он может быть использован только для объектов DOM. Нужно также отметить несколько моментов:writable: false doesn't work as expected.