Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Школа Web - пошаговые инструкции для создания сайта


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Школа Веб - JavaScript
Выпуск 6 от 2001-07-16

Школа Веб Ведущий Eris


Приступая к циклу статей о JavaScript я долго бродил по всяческой популярной русскоязычной литературе, с целью посмотреть а что люди пишут. А потом еще большее время - по англоязычной (в основном потому, что ее больше). И пришел к одному любопытному выводу - так, как принято изучать все прочие языки - JavaScript иззучать не стоит, и традиционный, университетский способ изложения материала (когда вначале проходят типы данных, потом функции, потом начинают собирать это в кучу) здесь абсолютно непригоден. И основная причина здесь в том, что этот язык просто не мыслим без объекто-ориентированного подхода. А потому в этой статье мы разберем что такое объектно-ориентированность и классы, а в следующей - как это относится к JavaScript. Кроме того, это поможет нам в дальнейшем работать с объектно-ориентированными языками.


Классы и объекты

Договоримся объектом называть все что угодно, что имеет самостоятельное существование в какой-то промежуток времени. Например, открыв упаковку (извините за банальность примера - сам только из магазина :), можете увидеть там, к примеру дюжину яиц, и каждое из них вполне самостоятельный объект. Он существует с того момента, как его снесла курица, и до того момента, как мы его съедим. Каждый из этих объектов можно пометить и обращаться к нему по имени. Но если я покажу на один из этих объектов и спрошу вас: "Что это?", вы ответите: "Яйцо. И вон то - тоже яйцо". И будете совершенно правы, поскольку все эти объекты очень похожи. Давайте договоримся группу схожих по определенным, выбранным нами самими признаков, называть классом. А то конкретное яйцо, из которого вылупится цыпленок Троша, будем называть экземпляром класса. То есть яйца - это класс, я конкретное яйцо - его экземпляр. Класс понятие абстрактное, и потому говорить что он существует нельзя. Вместо этого говорят что класс определен, если создано его формальное описание. В большинстве языков программирования это делается так:

1     class яйцо
2 {
3 };

Здесь "class" - ключевое слово, которое говорит о том, что мы создаем класс с именем "яйцо" и в фигурых скобках будет дано описание этого класса.

Свойства класса

Описание состоит из двух частей - описания свойств объектов и описание его поведения. Таким образом, мы сможем сказать что яйцо - это то, что обладает данными свойствами и ведет себя вот таким образом. Теперь нам необходимо определиться со свойствами объекта этого класса. Я думаю приведенные ниже стоки будут вам вполне понятны


1    class яйцо
2    {
3        диаметр;
4        длина;
5        форма;
6        вес;
7        цвет_скорлупы;
8        размер_желтка;
9        свежесть;
10  };

Я не задаюсь целью описать яйцо полностью, включая его химсостав, калорийную ценность и прочее. Я беру только те свойства, которые мне необходимы. При нужде, я всегда могу добавить новые. Пока мне о яйце достаточно знать, что оно имеет диаметр, длину, вес, скорлупу определенного цвета и желток определенного размера. Все остальное мне не надо, и потому - метафизика. Каждое из упомянутых мною свойств кроме имени должно иметь значение (не все яйца одинаковы, они отличаются друг от друга в пределах определенных нами свойств).

Методы класса

Теперь поговорим о поведении класса. Поведением будем называть все то, что объкт класса может делать сам, то с ним можно сделать и как он реагирует на внешние события. Все это задается методами класса. Например, мы можем задать метод протухнуть - для задания поведения объекта с течением времени, методы сварить и поджарить для определения того что мы можем делать с объектом и для реакции на события зададим метод наЗавтрак и наОбед



1    class яйцо
2    {
3        диаметр;
4        длина;
5        форма;
6        вес;
7        цвет_скорлупы;
8        размер_желтка;
9        свежесть;
10
11      протухнуть()
12      {
13            уменьшить параметр свежесть на 1;
14      }
15      сварить()
16      {    если свежесть больше 0 то ... здесь поразвлекайтесь сами ... иначе выбросить }
17       поджарить()
18      {  если свежесть больше 0 то ... здесь тоже ... иначе выбросить}
19       наЗавтрак()
20       {
21              поджарить();
22        }
23        наОбед()
24        {
25              сварить();
26              покрошить;
27     добавить майонез;
28     посыпать луком;
29         }
30   };
    

Со строками 1-9 вроде все ясно - описываем свойства яйца. Строка 11 объявляет функцию протухнуть. Предполагаем, что яйцо производится курицой с допустимым параметром свежесть (сроком хранения) 14 дней. Вызывая эту функцию (или правильнее сказать применяя этот метод) уменьшаем количество дней, которые остались до порчи продукта. Мы, к примеру можем создать объект класса холодильник, который и будет вызывать этот метод раз в сутки. Создается метод просто. Вначале пишется имя метода, за которым идут круглые скобки - признак функции. После этого в фигурных скобках описывается, что эта функция должна делать. В круглых скобках методу можно передать параметр, который будет использован внутри функции. Например, методу варить можно указать - всмятку, вкрутую и т.д.

Строки 15-16 задают последовательность действий, которые необходимо выполнить, чтобы сварить яйцо. Разумеется предварительно нужно удостовериться, что яйцо не протухло :). Строки 17-18 устоены аналогично.

Строка 19 объявляет обработчик события. Это событие будет вызвано автоматически при наступления времени завтрака. Как видите - это обыкновенная функция, но только имя у нее должно быть строго определенным. Этот метод будет вызываться каждый раз когда в систему будет поступать сигнал "Завтракать". Как правило, в документации поставляется список событий, на которые объект должен среагировать. Если мы не определили обработчик события, то ничего не произойдет. На ужин, например, яиц не будет.

Обработчик наЗавтрак() содержит вызов метода поджарить(), который мы определили раньше. Таким образом нам не надо писать код повтроно - мы используем старый. А обработчик наОбед() предписывает применить к объекту "яйцо, из которого мог бы вылупиться цыпленок Троша" метод сварить(), а потом выполнить еще некоторые действия.

Все это удобно чем? Тем, что мы один раз определились что можно делать с яйцами, и можем применять это к любому объекту класса яйцо не переписывая для этого код. Более того, в JavaScript все нужные классы уже созданы - нам нужно только научиться применять их.

Есть еще два важных метода, которые мы не рассмотрели. Они касаются того как экземпляр яйца создается и как он уничтожается. Первый из них называется конструктором, его имя должно совпадать с именем класса, в нашем случае яйцо(). Второй называется дестуктором и обозначается как ~яйцо(). Говоря проще, курица производя экземпляр класса яйцо применяет к нему метод яйцо(). Не вдаваясь в анатомические детали и в участие петуха, этот метод можно описать так

яйцо()
{
     определиться с размерами яйца которое необходимо снести.
     определиться с окраской скорлупы исходя из анатомических соображений
     определиться с параметром свежести
     создать содержимое определенного веса
     заключить его в скорлупу
     завершить создание объекта
}

Этот код должен быть помещен внутрь описания класса. Здесь мы имеем во-первых инициализацию свойств класса - после создания яйца нам будет доступен его размер, вес и так далее. Кроме того конструктор может выполнять некотрые действия, создавать другие объекты (скорлупу, например).

Вот теперь мы можем написать программу, которая обеспечит нам завтрак.

яйцо новое_яйцо= new яйцо();              // создали объект новое_яйцо класса яйцо, использовав опрератор создания
                                                             // нового объекта new  и конструктор яйцо()

новое_яйцо.наЗавтрак();                     // готовим завтрак из яйца.

Все. Один раз потратив усилия на описание класса яиц, мы можем приготовить обед в любое время, написав всего лишь две строчки. Делается все в 2 этапа. Первый - это создание экземпляра класса. В данном случае мы создали объект с помощью оператора new и конструктора и поместили все это в переменную новое_яйцо. Теперь мы можем применить к нему любое из описанных нами действий, используя оператор . (точка) и имя этого метода.


Вот и все, что нам необходимо знать о классах, для того что бы начать программировать на JavaScript. Идеи, которые мы разобрали являются лишь малой частью объектно ориентированного программирования, но в приложении к JavaScript нам этого будет достаточно, поскольку мы будем использовать уже готовые классы и работать с уже определенными методами. Все что нам нужно сделать - это разобрать структуру классов JavaScript и научиться применять эти методы. Это мы и будем делать в последующих статьях.

Если вы не получали предыдущих выпусков, найти вы можете в архиве рассылки или на сайте рассылки

 


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное