Объекты
Выше были рассмотрены два вида переменных: обычные переменные, иначе говоря, скаляры и массивы. Скаляры могут содержать только одно значение, массивы же — множество пронумерованных значений, доступ к которым можно получить по их номеру — индексу. И скаляры, и массивы находят свое применение в программах на JavaScript ; нет смысла рассказывать, в каких случаях что применять, — это и так очевидно. Давайте лучше поговорим еще об одном виде переменных, которого мы до сих пор не касались.
Это объекты.
Объектом называется сложный тип данных, содержащий не какоето одно значение, а целую сущность. Эта сущность может иметь набор свойств и' методов, с помощью которых программа может ей управлять; свойство- это своего рода переменная, принадлежащая объекту, а метод — функция, также принадлежащая объекту и выполняющая над ним какие-либо действия. Объект (и сущность, содержащаяся в нем) представляет собой "вещь в себе"; ее внутренняя структура и принцип действия неизвестны использующему объект программисту.
В качестве примера объекта можно рассмотреть прекрасно знакомый вам Web -обозреватель. У него есть свойство "адрес" и метод "открыть Web -страницу, которой принадлежит этот адрес". Вы можете присвоить этому свойству нужный адрес, а также можете его оттуда считать и присвоить какой-либо переменной или использовать иным способом:
currentWebBrowser.address = "http://www.w3c.org";
currAddr = currentWebBrowser.address + "/css/";
Именно такой синтаксис используется для доступа к свойствам: <имя объекта>.<имя свойства> (не забудьте поставить знак точки). В первом случае мы поместили в свойство address объекта currentWebBrowser строку с интернет-адресом комитета WWWC . Во втором случае мы извлекли из этого свойства находящийся в нем адрес, прибавили к нему справа текст "/ css /" и присвоили переменной currAddr . (Как видите, для слияния (или конкатенации) строк использовался оператор +.)
Для вызова метода используется аналогичный синтаксис: <имя объекта>. <имя метода> (). Сейчас мы вызовем метод до вышеупомянутого объекта:
currentWebBrowser . go () ;
Метод go — не что иное, как обычная функция. В данный момент возвращенное ей значение игнорируется, но в других случаях оно может использоваться. Также метод, как и любая функция, может принимать параметры:
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 — функция) и имени метода дото, который она реализует.
Теперь перепишем функцию-конструктор таким образом, чтобы создать новый метод goto .
function WebBrowser (homePage) {
this.address = homePage;
this.goTo = fGoTo;
Как видите, мы "присваиваем" написанную нами функцию fGoTo свойству дото класса WebBrowser . После этого можно вызывать метод дото этого класса.
var currentWebBrowser ;
currentWebBrowser = new WebBrowser("http://www.server.ru/home_page.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 предусматривает полный набор методов для работы со значениями даты и времени. Другие системные классы также имеют достаточно большие наборы свойств и методов, которые мы не будем здесь рассматривать.
Системный класс 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 -обозреватель. Его классы и системные объекты — это что-то особенное