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