Меню

JavaScript: Типы свойств и их атрибуты

Свойства делятся на два типа: свойства с данными и свойства с функциями доступа.

Свойство с данными – это обычное свойство для хранения значения. Каждое свойство с данными имеет следующие 4 атрибута:

  • writable – определяет доступность свойства для записи значения.
  • enumerable – определяет доступность свойства для перечисления в цикле for-in.
  • configurable – определяет можно ли удалить свойство с помощью оператора delete и можно ли изменять атрибуты свойства. Свойство, которое можно удалить и у которого можно изменять атрибуты называют настраиваемым, а которое нельзя удалить и у которого нельзя изменять атрибуты – ненастраиваемым. Свойство, которое определено как ненастраиваемое, нельзя снова сделать настраиваемым, попытка вызвать метод Object.defineProperty() и изменить любой атрибут приведёт к ошибке.
  • value – содержит фактическое значение. Это место, откуда читается значение свойства и куда сохраняется новое значение.

По умолчанию, при добавлении нового свойства объекту, атрибутам configurable, enumerable и writable присваивается значение true, а атрибуту value – указанное значение.

Чтобы изменить для свойства предлагаемое по умолчанию значение какого-либо атрибута нужно использовать метод Object.defineProperty(). Он принимает три аргумента: объект, для которого требуется добавить новое свойство или изменить уже существующее, имя свойства и объект-дескриптор. Свойства дескриптора соответствуют именам атрибутов: configurable, enumerable, writable и value. Все свойства дескриптора кроме value в качестве значения принимают только значение булева типа:


var user = {};
Object.defineProperty(user, "age", {
  writable: false,
  value: 25
});

alert(user.age);   // 25
user.age = 10;
alert(user.age);   // 25

При вызове метода Object.defineProperty() атрибуты configurable, enumerable и writable получают по умолчанию значение false, если не указано иное.

Свойство с функциями доступа – это свойство, которое не содержит данных. Вместо этого оно содержит функции чтения и записи. Каждое свойство с функциями доступа имеет следующие 4 атрибута:

  • enumerable – определяет доступность свойства для перечисления в цикле for-in.
  • configurable – определяет можно ли удалить свойство с помощью оператора delete и можно ли изменять атрибуты свойства. Свойство, которое можно удалить и у которого можно изменять атрибуты называют настраиваемым, а которое нельзя удалить и у которого нельзя изменять атрибуты – ненастраиваемым. Свойство, которое определено как ненастраиваемое, нельзя снова сделать настраиваемым, попытка вызвать метод Object.defineProperty() и изменить любой атрибут приведёт к ошибке.
  • get – функция, вызываемая при чтении свойства. Данная функция отвечает за возвращаемое значение. По умолчанию атрибут имеет значение undefined.
  • set – функция, вызываемая при записи свойства. По умолчанию атрибут имеет значение undefined.

Создать свойство с функциями доступа можно только с помощью метода Object.defineProperty():


var user = { _age: 0 };

Object.defineProperty(user, "age", {
  get: function () {
    return this._age;
  },
  set: function (newValue) {
    if (newValue > 0)
      this._age = newValue;
  }
});

alert(user.age);   // 0
user.age = -10;
alert(user.age);   // 0
user.age = 10;
alert(user.age);   // 10

Определять сразу обе функции доступа не обязательно. Если свойству назначена только функция чтения, это означает, что оно не поддерживает запись. Если свойству назначена только функция записи, это означает, что оно не поддерживает чтение.