Объекты
Выше
были рассмотрены два вида переменных: обычные переменные, иначе говоря, скаляры
и массивы. Скаляры могут содержать только одно значение, массивы же — множество
пронумерованных значений, доступ к которым можно получить по их номеру — индексу.
И скаляры, и массивы находят свое применение в программах на JavaScript; нет
смысла рассказывать, в каких случаях что применять, — это и так очевидно. Давайте
лучше поговорим еще об одном виде переменных, которого мы до сих пор не касались.
Это
объекты.
Объектом
называется сложный тип данных, содержащий не какое-то одно значение, а целую
сущность. Эта сущность может иметь набор свойств и методов, с помощью которых
программа может ей управлять; свойство -это своего рода переменная, принадлежащая
объекту, а метод — функция, также принадлежащая объекту и выполняющая над ним
какие-либо действия. Объект (и сущность, содержащаяся в нем) представляет собой
"вещь в себе"; ее внутренняя структура и принцип действия неизвестны
использующему объект программисту.
В
качестве примера объекта можно рассмотреть прекрасно знакомый вам Web-обозреватель.
У него есть свойство "адрес" и метод "открыть Web-страницу, которой
принадлежит этот адрес". Вы можете присвоить этом свойству нужный адрес,
а также можете его оттуда считать и присвоить какой-либо переменной или использовать
иным способом:
currentWebBrowser.address
= "http://www.w3c.org"; currAddr =
currentWebBrowser.address + "/сss/";
Именно
такой синтаксис используется для доступа к свойствам: <имя объеках <имя
свойства> (не забудьте поставить знак точки). В первом случае мы поместили
в свойство address объекта currentWebBrowser строку с интернет-адресом комитета
WWWC. Во втором случае мы извлекли из этого свойства находящийся в нем адрес,
прибавили к нему справа текст "/сss/" и присвоили переменной currAddr.
(Как видите, для слияния (или конкатенации) строк использовался оператор +.)
Для
вызова метода используется аналогичный синтаксис: <имя объекта>. <имя
метода> (). Сейчас мы вызовем метод до вышеупомянутого объекта:
currentWebBrowser.gо
();
Метод
до — не что иное, как обычная функция. В данный момент возвращенное ей значение
игнорируется, но в других случаях оно может использоваться. Также метод, как
и любая функция, может принимать параметры:
currentWebBrowser.goTo("http://www.w3c.org");
Таким
образом мы можем управлять Web-обозревателем. И — заметьте -ничего не зная о
его внутреннем устройстве. Более того, мы не обязаны о нем знать. Использование
объектов как раз и направлено на то, чтобы позволить программистам пользоваться
различными инструментами и дополнительными компонентами, не зная их внутреннего
устройства, а также создавать такие инструменты и компоненты для своих коллег.
Говорят,
что JavaScript — объектно-ориентированный язык программирования, т. к. использует
объекты. Этим он отличается от обычных, процедурных языков, которые используют
только функции.
Каждый
объект перед тем, как с ним можно будет работать, должен быть создан. Выполняется
это с помощью оператора создания объекта new.
var
currentWebBrowser; currentWebBrowser = new WebBrowser();
Здесь
объявляется переменная currentWebBrowser и ей присваивается вновь созданный
с помощью оператора new объект. Этот объект создан на основе класса WebBrowser,
который является как бы шаблоном для создаваемых объектов. A currentWebBrowser
также иногда называется экземпляром класса
WebBrowser.
Удалить
ненужный объект можно с помощью метода delete.
currentWebBrowser.delete();
Имейте
в виду, что ненужные объекты, созданные вами, всегда надо удалять, чтобы освободить
ресурсы системы. Исключение составляют только истемные объекты, создаваемые
самим интерпретатором или предоставляемые интерпретатору Web-обозревателем.
Если вы попытаетесь удалить системный объект, интерпретатор выдаст сообщение
об ошибке. О системных объектах мы поговорим ниже.
Но
каким же образом создаются классы объектов? Исключительно просто. Более того,
если бы остальные языки объектно-ориентированного программирования увидели,
как легко создаются классы в JavaScript, они бы умерли от зависти. Взглянем
еще раз на выражение, с помощью которого создаются объекты:
currentWebBrowser
= new WebBrowser();
Согласитесь,
это сильно напоминает вызов функции. Но дело в том, что WebBrowser — и есть
функция, только специальным образом написанная. Она называется конструктором
класса. Давайте напишем конструктор для класса WebBrowser.
function
WebBrowser() {
this.address
= "http://www.server.ru/my_home_page.htm";
}
Этот
код создает в классе WebBrowser одно-единственное свойство address. Обратите
внимание на синтаксис, с помощью которого это делается. В качестве имени класса
используется ключевое слово this, обозначающее текущий класс. Интерпретатор
JavaScript создает свойства класса сразу же при первом обращении к ним; вот
и в нашем случае он создал свойство address и дал ему значение, присвоенное
нами. Конструктор может принимать параметры:
function
WebBrowser(homePage) { this.address = homePage;
}
Таким
образом мы можем передать конструктору класса адрес домашней страницы, с которой
начнется путешествие по Интернету.
var
currentWebBrowser;
currentWebBrowser
= new WebBrowser("http://www.server.ru/home_page.htm");
"Но,
позвольте! — скажете вы. — А как же создаются методы класса?" Тоже очень
просто.
Прежде
всего, нам нужно написать функцию, реализующую этот метод.
function
fGoTo(pageAddress) { this.address = pageAddress;
Мы
назвали эту функцию fGoTo. Это имя состоит из буквы f (от англ. function — функция)
и имени метода дото, который она реализует.
Теперь
перепишем функцию-конструктор таким образом, чтобы создать новый метод дото.
function
WebBrowser(homePage) {
this.address
= homePage;
this.goTo
= fGoTo; }
Как
видите, мы "присваиваем" написанную нами функцию fGoTo свойству дото
класса WebBrowser. После этого можно вызывать метод дото этого класса.
var
currentWebBrowser;
currentWebBrowser
= new WebBrowser("http://www.server.ru/home_jpage.htm");
currentWebBrowser.goTo("http://www.w3c.org");
Только
что вы научились создавать простейшие классы. Но на самом деле вам в очень редких
случаях придется делать это. Куда чаще вы будете пользоваться уже готовыми системными
классами, предоставляемыми самим интерпретатором JavaScript и другими программами,
например Web-обозревателем. Поэтому давайте поговорим о системных классах.
Системных
классов, предоставляемых программисту интерпретатором, довольно много. Среди
них есть, например, класс Date, предназначенный для работы со значениями даты
и времени.
var
d;
d
= new Date () ;
Только
что мы создали объект класса Date. Так как мы не передали параметр в функцию
конструктора этого класса, интерпретатор поместил в этот объект значение текущей
даты. После этого можно, например, узнать номер дня недели:
var
dayNumber; dayNumber = d.getDay(};
Или
выяснить год:
var
year;
year
= d.getFullYear();
Некоторые
методы класса Date перечислены в табл. 13.1.
Как
видите, класс Date предусматривает полный набор методов для работы со значениями
даты и времени. Другие системные классы также имеют достаточно большие наборы
свойств и методов, которые мы не будем здесь рассматривать.
Таблица
13.1. Некоторые методы класса Date
Метод |
Описание |
||
getDate
( ) |
Возвращает
число |
||
getDay
( ) |
Возвращает
цифру, обозначающую день недели (0 — воскресенье, 1 — понедельник,
2 — вторник и т. д.) |
||
getFullYear() |
Возвращает
год |
||
getHours
( ) |
Возвращает
час |
||
getMilliseconds
( ) |
Возвращает
миллисекунды |
||
getMinutes
( ) |
Возвращает
минуты |
||
getMonth
( ) |
Возвращает
цифру, обозначающую месяц (от 0 до 11) |
||
getSeconds
( ) |
Возвращает
секунды |
||
getTime
( ) |
Возвращает
время в виде количества миллисекунд, прошедших с полуночи 1 января
1 970 года |
||
Системный
класс Math — другого рода. Он включает набор свойств и методов, реализующих
различные математические и тригонометрические функции. Единственный его объект
создается самим интерпретатором JavaScript при запуске и уничтожается при завершении
работы. Так что вам не нужно самим создавать объекты этого класса. Это как раз
типичный случай системного объекта.
var
f;
f
= Math.sin(Math.PI);
В
результате вычисления вышеприведенного выражения в переменной f окажется значение
sin (я).
Существуют
также системные классы Number и string, служащие для хранения данных соответственно
числового и строкового форматов, и несколько других системных классов, используемых
значительно реже.
Язык
JavaScript имеет одну любопытную особенность. Дело в том, что любая переменная
обычного типа данных может быть представлена как объект какого-либо класса.
Давайте, например, рассмотрим следующий код:
var
s, 1;
s
= "JavaScript";
1
= s.length;
Здесь
мы сначала помещаем в переменную s строку "JavaScript", а потом вызываем
свойство length этой переменной. В таком случае интерпретатор
считает
переменную s объектом класса string и беспрепятственно "пускает" нас
к свойству length этого класса, возвращающему длину строки текста, которую мы
и помещаем в переменную 1.
Аналогичный
"финт" можно проделать и с числовой величиной:
var
a, s;
а
= 16765247;
s
= a.toString();
Здесь
вызываем метод toString класса Number, возвращающий строковое представление
числа.
Раньше говорилось, что, помимо интерпретатора JavaScript, системные классы могут представляться также и другими программами. К числу этих самых "других" программ относится Web-обозреватель. Его классы и системные объекты — это что-то особенное...