Объекты – это составные типы данных: они объединяют несколько значений в единый модуль и позволяют нам записывать и сохранять эти значения по имени. Другими словами, объект – это неупорядоченная коллекция свойств, каждое из которых имеет имя и значение. Именованные значения, содержащиеся в объекте, могут быть как элементарными типами, например числами или строками, так и другими объектами.
Создание объектов
Объекты создаются с помощью оператора new. За этим оператором должно быть указано имя функции-конструктора, служащей для инициализации объекта. Например, пустой объект (объект без свойств) создается так:
var o = new Object();
JavaScript поддерживает другие встроенные функции-конструкторы, инициализирующие созданные объекты менее тривиальными способами. Например, конструктор Date() инициализирует объект, представляющий дату и время:
var now = new Date(); // Текущие дата и время
var new_years_eve = new Date(2000, 11, 31); // Обозначает 31 декабря 2000
Позднее в этой главе мы увидим, что можно определять собственные методыконструкторы, инициализирующие новые объекты нужным вам способом. Объектные литералы предоставляют другой способ создания и инициализации новых объектов. Как мы видели в главе 3, объектные литералы позволяют встраивать описания объекта в код JavaScript в виде литерала, во многом так же, как мы встраиваем в код JavaScript текстовые данные в виде строк в кавычках. Объектный литерал представляет собой заключенный в фигурные скобки список спецификаций свойств, разделенных запятыми. Каждая спецификация свойства в объектном литерале состоит из имени свойства, за которым следует двоеточие и значение свойства. Например:
var circle = { x:0, y:0, radius:2 }
var homer = {
name: "Homer Simpson",
age: 34,
married: true,
occupation: "plant operator",
email: "homer@simpsons.com"
};
Синтаксис объектных литералов определен в спецификации ECMAScript v3 и реализован в JavaScript 1.2 и более поздних версиях.
Установка и получение свойств
Обычно для доступа к значениям свойств объекта применяется оператор . (точка). Значение в левой части оператора должно быть ссылкой на объект (обычно просто именем переменной, содержащим ссылку на объект). Значение в правой части оператора должно быть именем свойства. Это должен быть идентификатор, а не строка или выражение. Так, обратиться к свойству p объекта o можно посредством выражения o.p, а к свойству radius объекта circle – circle.radius. Свойства объекта работают как переменные: в них (в свойствах) можно сохранять значения и считывать их. Например:
// Создаем объект. Сохраняем ссылку на него в переменной.
var book = new Object();
// Устанавливаем свойство в объекте.
book.title = "JavaScript: Наиболее полное руководство"
// Устанавливаем другие свойства. Обратите внимание на вложенные объекты.
book.chapter1 = new Object();
book.chapter1.title = "Введение в JavaScript";
book.chapter1.pages = 19;
book.chapter2 = { title: "Лексическая структура", pages: 6 };
// Читаем значения некоторых свойств из объекта.alert("Заголовок: " + book.title + "
" +
"Глава 1 " + book.chapter1.title + "
" +
"Глава 2 " + book.chapter2.title);
Важно обратить внимание на один момент в этом примере – новое свойство объекта можно создать, просто присвоив ему значение. Если переменные должны быть объявлены с помощью ключевого слова var, то для свойств объекта нет необходимости (и способа) делать это. К тому же, после того как вы создадите свойство объекта, присвоив ему значение, в любой момент можно изменить значение свойства, просто присвоив ему новое значение:
book.title = "JavaScript: Книга с носорогом"
Перечисление свойств
Цикл for/in, который обсуждался в главе 6, предоставляет способ осуществления цикла по свойствам объекта, или их перечисления. Это может быть полезно при отладке сценариев или при работе с объектами, которые могут иметь произвольные свойства, имена которых заранее не известны. Следующий код показывает функцию, позволяющую вывести список имен свойств объекта:
function DisplayPropertyNames(obj) {
var names = "";
for(var name in obj) names += name + "
";
alert(names);
}
Обратите внимание, что цикл for/in не перечисляет свойства в каком-либо определенном порядке, и, несмотря на то что он перечисляет все свойства, определенные пользователем, он не перечисляет некоторые предопределенные свойства и методы.
Неопределенные свойства
Если попытаться прочитать значение несуществующего свойства (свойства, которому никогда не присваивалось значение), будет получено значение undefined.
Для удаления свойства объекта предназначен оператор delete:
delete book.chapter2;
Обратите внимание, что при удалении свойства его значение не просто устанавливается в undefined; оператор delete действительно удаляет свойство из объекта. Цикл for/in демонстрирует это отличие: он перечисляет свойства, которым было присвоено значение undefined, но не перечисляет удаленные свойства.