Объект 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 */