Методы для работы со свойствами

В ECMAScript 5 было добавлено много новых методов объекта Object:


// Добавить или изменить свойство объекта
Object.defineProperty(объект, свойство, описатель)

// Добавить или изменить несколько свойств объекта
Object.defineProperties(объект, описатель)

// Доступ к свойствам
Object.getOwnPropertyDescriptor(объект, свойство)

// Возвращает все свойства в виде массива
Object.getOwnPropertyNames(объект)

// Возвращает перечисляемые свойства в виде массива
Object.keys(объект)

// Доступ к прототипу
Object.getPrototypeOf(объект)

// Запрещает добавление свойств объекту
Object.preventExtensions(объект)
// Возвращает true, если объекту разрешено добавлять свойства
Object.isExtensible(объект)

// Запрещает изменять свойств объекта (не значения)
Object.seal(объект)
// Возвращает true, если объект "запечатан"
Object.isSealed(объект)

// Запрещает любые изменения объекта
Object.freeze(объект)
// Возвращает true, если объект "заморожен"
Object.isFrozen(объект) 

Изменение значения свойства

Синтаксис:


Object.defineProperty(объект, свойство, {value : значение})

В следующем примере изменяется значение свойства объекта:


var person = {
   firstName: "John",
   lastName : "Doe",
   language : "EN" 
};

// Изменяем значение свойства
Object.defineProperty(person, "language",  {value : "NO"}); 

Изменение метаданных свойства

ES5 позволяет изменять следующие метаданные свойства:


writable : true      // Значение свойства можно изменять
enumerable : true    // Свойство может перечисляться
configurable : true  // Свойство может настраиваться


writable : false     // Значение свойства нельзя изменять
enumerable : false   // Свойство не может перечисляться
configurable : false // Свойство не может настраиваться

ES5 позволяет изменять геттеры и сеттеры:


// Определение геттера
get: function() { return language }
// Определение сеттера
set: function(value) { language = value } 

В следующем примере мы делаем свойство language только для чтения:


Object.defineProperty(person, "language", {writable:false}); 

В следующем примере мы делаем свойство language неперечисляемым:


Object.defineProperty(person, "language", {enumerable:false}); 

Перечень всех свойств

В следующем примере создается перечень всех свойств объекта:


var person = {
   firstName: "John",
   lastName : "Doe"
   language : "EN" 
};

Object.defineProperty(person, "language", {enumerable:false});
Object.getOwnPropertyNames(person);  // Возвращает массив свойств

Перечень перечисляемых свойств

В следующем примере создается перечень только перечисляемых свойств объекта:


var person = {
   firstName: "John",
   lastName : "Doe"
   language : "EN" 
};

Object.defineProperty(person, "language", {enumerable:false});
Object.keys(person);  // Возвращает массив перечисляемых свойств

Добавление свойства

В следующем примере объекту добавляется новое свойство:


// Создаем объект
var person = {
  firstName: "John",
  lastName : "Doe",
  language : "EN"
};

// Добавляем свойство
Object.defineProperty(person, "year",  {value:"2008"});

Добавление геттеров и сеттеров

Метод Object.defineProperty() также может использоваться для добавления геттеров и сеттеров:


// Создаем объект
var person = {firstName:"John", lastName:"Doe"};

// Определяем геттер
Object.defineProperty(person, "fullName", {
  get : function () {return this.firstName + " " + this.lastName;}
}); 

Пример счетчика


// Определяем объект
var obj = {counter : 0};

// Определяем геттеры и сеттеры
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (value) {this.counter -= value;}
});

// Поиграем со счетчиком
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;