Этот сайт - часть системы сайтов для начинающих веб-мастеров
|
Выше были
рассмотрены два вида переменных: обычные переменные, иначе говоря, скаляры и
массивы. Скаляры могут содержать только одно значение, массивы же — множество
пронумерованных значений, доступ к которым можно получить по их номеру — индексу.
И скаляры, и массивы находят свое применение в программах на 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. Некоторые методы класса Da te
Метод |
Описание |
||
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-обозреватель. Его классы и системные объекты — это что-то особенное...