Объект Object в JavaScript

Объект-конструктор Object является фундаментальным. Он используется для создания любого объекта. Все встроенные объекты базируются на нём и являются его наследниками.

var date = new Date();
alert(date instanceof Date); // true
alert(date instanceof Object); // true

Данный объект-конструктор можно использовать для преобразования любого значения в объект. Если при создании объекта конструктору Object передать какое-либо значение, то вернётся это же значение, но с типом object.

var num = new Object(21);
alert(num); // 21
alert(typeof num); // 'object'

Если передать null или undefined, то будет создан пустой объект.

Свойства объекта Object

length

Свойство length представляет количество аргументов, принимаемых конструктором. Оно всегда имеет значение 1.

alert(Object.length); // 1
var obj = new Object();
alert(obj.length); // undefined

prototype

Свойство prototype используется для добавления свойств объектам наследникам класса Object. Фактически, свойство prototype содержит объект (прототип объекта Object), в котором хранятся свойства для наследования новыми объектами. Добавляя свойства объекту Object.prototype, эти свойства добавляются всем объектам, которые являются наследниками Object и в которых они не заданы явно.

var obj = new Object(); /* пустой объект */
Object.prototype.str = 'новое свойство';
alert(obj.str); /* 'новое свойство' */

Методы объекта Object

freeze()

Метод freeze() замораживает объект, переданный аргументом. Это означает, что объекту нельзя добавить новые свойства, а также удалить или изменить уже имеющиеся. Однако, если свойством является другой объект, то на него заморозка не распространяется. Метод возвращает замороженный объект.

var obj = new Object();
var o = Object.freeze(obj);
obj.str = 'свойство';
alert(obj.str); // undefined

isFrozen()

Метод isFrozen() проверяет, является ли объект замороженным (свойства нельзя добавлять, удалять, изменять). Возвращает true или false.

var obj = {};
Object.freeze(obj);
alert(Object.isFrozen(obj)); // true

seal()

Метод seal() запечатывает указанный объект. Его использование приводит к тому, что объекту нельзя добавить новые свойства, удалить уже имеющиеся, а также изменить атрибуты имеющихся свойств. Однако, значения имеющихся свойств можно изменять.

var obj = {
  prop1: 'свойство1',
  prop2: 2
};
Object.seal(obj);

obj.prop3 = 'свойство3'; /* попытка добавить свойство */
alert(obj.prop3); /* undefined, свойство не добавилось */

alert(delete obj.prop1); /* false, свойство не удалилось */

obj.prop2 = 'свойство2'; /* попытка изменить значение */
alert(obj.prop2); /* 'свойство2', свойство изменилось */

isSealed()

Метод isSealed() проверяет, является ли объект запечатанным (свойства нельзя добавлять, удалять). Возвращает true или false.

var obj = {};
Object.seal(obj);
alert(Object.isSealed(obj)); // true

preventExtensions()

Метод preventExtensions() запрещает добавлять объекту новые свойства (объект становится нерасширяемым). При этом уже имеющиеся свойства можно изменять или удалять. Выполнить обратную операцию (сделать объект расширяемым) нельзя. Метод возвращает нерасширяемый объект.

var obj = {name: 'имя'};
Object.preventExtensions(obj);
delete obj.name;
alert(obj.name); /* undefined, свойство name удалилось */
obj.nick = 'никнейм';
alert(obj.nick); /* undefined, свойство nick не добавилось */

isExtensible()

Метод isExtensible() проверяет, является ли объект расширяемым, то есть можно ли ему добавить новые свойства. По умолчанию все объекты являются расширяемыми. Запретить добавление новых свойств можно с помощью методов Object.freeze(), Object.seal() или Object.preventExtensions(). Возвращает true или false.

var obj = {};
alert(Object.isExtensible(obj)); // true
Object.preventExtensions(obj);
alert(Object.isExtensible(obj)); // false

keys()

Метод keys() возвращает массив из собственных свойств объекта (то есть свойств, заданных конкретно для указанного объекта, не включая свойства, унаследованные из прототипа).

var obj = {}; /* Пустой объект класса Object */
obj.prop1 = 'свойство1';
obj.prop2 = 'свойство2';

alert(Object.keys(obj)); /* prop1,prop2 */

if ('toString' in obj) {
  alert('Свойство toString тоже есть');
} /* Свойство toString унаследовано из конструктора */

Свойства наследников Object

constructor

Свойство constructor содержит код конструктора, с помощью которого создан объект.

function Fake() {}

var fake = new Fake();
alert(fake.constructor); /* 'function Fake() {}' */

Методы наследников Object

toString()

Метод toString() вызывается всегда, когда объект должен быть представлен в виде строкового значения. Например, данный метод вызывается при попытке вывода объекта с помощью функции alert(). При вызове возвращается строка [object Object]. Для любого объекта можно задать свой метод toString(), выполняя условия:

  • метод не должен иметь аргументов;
  • метод должен возвращать любое примитивное значение.
var obj = {
  prop: 'свойство'
};
alert(obj); /* [object Object] */
obj.toString = function() {
  return 'примитив';
};
alert(obj); /* примитив */

valueOf()

Метод valueOf() вызывается всегда, когда объект должен быть представлен в виде числового значения. Например, данный метод вызывается при использовании операторов сравнения. По умолчанию данный метод возвращает то же значение, что и метод toString(). Для любого объекта можно задать свой метод valueOf(), выполняя условия:

  • метод не должен иметь аргументов;
  • метод должен возвращать любое примитивное значение.
var obj = {};

alert(obj == '[object Object]'); /* true, значение из toString() */

obj.valueOf = function() {
  return 100;
};
alert(+obj); /* 100 */