Методы объектов JavaScript ES5

ECMAScript 5 (2009) добавил JavaScript многими новыми методами объектов.

Управление объектом

// Создает объект с существующим объектом в качестве прототипа
Object.create()
// Добавление или изменение свойств объекта
Object.defineProperty(object, property, descriptor)
// Добавление или изменение свойств объекта
Object.defineProperties(object, descriptors)
// Доступ к свойству
Object.getOwnPropertyDescriptor(object, property)
// Возвращает массив всех свойств
Object.getOwnPropertyNames(object)
// Доступ к прототипу
Object.getPrototypeOf(object)
// Возвращает массив итерируемых свойств
Object.keys(object)

Защита объекта

// Предотвращает добавление свойств к объекту
Object.preventExtensions(object)
// Возвращает true, если свойства могут быть добавлены к объекту
Object.isExtensible(object)
// Предотвращает изменение свойств объекта (не значений)
Object.seal(object)
// Возвращает true, если объект запечатан
Object.isSealed(object)
// Предотвращает любые изменения в объекте
Object.freeze(object)
// Возвращает true, если объект заморожен
Object.isFrozen(object)

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

Грамматика

Object.defineProperty(object, property, {value : value)

например

Этот пример изменяет значение свойства:

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Изменение свойства
Object.defineProperty(person, "language", {value : "NO"});

Попробуйте сами

Изменение метаданных

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

writable : true      // Значение свойства может быть изменено
enumerable : true    // Свойство может быть итерировано
configurable : true  // Свойство может быть повторно настроено
writable : false     // Значение свойства не может быть изменено
enumerable : false   // Свойство не подлежит итерации
configurable : false // Свойство не может быть перепрограммировано

ES5 позволяет изменять getter и setter:

// Определение getter
get: function() { return language }
// Определение setter
set: function(value) { language = value }

Этот пример устанавливает language в только чтение:

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

Этот пример делает language неперечисляемым:

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

Показать все свойства

Этот пример показывает все свойства объекта:

например

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
Object.defineProperty(person, "language", {enumerable:false});
Object.getOwnPropertyNames(person);  // Возвращает массив массивов

Попробуйте сами

Показать перечислимые свойства

Этот пример показывает только перечислимые свойства объекта:

например

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

Попробуйте сами

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

Этот пример добавляет новый атрибут объекту:

например

// Создание объекта
const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Добавление свойства
Object.defineProperty(person, "year", {value:"2008"});

Попробуйте сами

Добавление Getter и Setter

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

например

// Создание объекта
const person = {firstName:"Bill", lastName:"Gates"};
// Определение getter
Object.defineProperty(person, "fullName", {
  get: function () {return this.firstName + " " + this.lastName;}
});

Попробуйте сами

например, экземпляр счетчика

// Определение объекта
const obj = {counter:0};
// Определение setter
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 (i) {this.counter -= i;}
});
// Операции с счетчиком:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;

Попробуйте сами