Роботландский Университет © А.А.Дуванов |
Понятие объекта является ключевым в современном программировании.
Идея объекта очень проста рассматривать данные и функции, которые эти данные обрабатывают, как одно целое.
Объект это единая конструкция, содержащая в себе набор данных и функций или, в терминологии JavaScript, набор свойств и методов.
функция = метод |
переменная = свойство |
Этим термином обозначают скрытие внутреннего устройства объекта. Объект рассматривается как черный ящик. Известны свойства объекта, то есть доступные извне переменные. Известны методы объекта, то есть доступные извне функции. Но как устроены эти функции, по каким алгоритмам они работают, программисту не сообщается.
Программист, пользователь объекта, не знает и о том, есть ли у объекта дополнительные внутренние вспомогательные функции и переменные и как они связаны с доступными свойствами и методами.
Вот телевизор это сложное устройство. Но зачем пользователю знать, что внутри этого объекта? Достаточно уметь нажимать кнопки на пульте, чтобы заставить ящик показывать нужную программу с подходящей громкостью.
Инкапсуляция удобна, правда? Она позволяет слабому человеческому разуму справиться с огромными информационными потоками, закрывая глаза на несущественные детали.
Кто-то делает микросхемы, кто-то собирает из них телевизор, кто-то смотрит программу Время. И все довольны. Каждый хорошо знает свое дело. Представьте, что для просмотра телевизора необходимо было бы знать в деталях устройство этих паукообразных штук, которые называют микросхемами, а также технологию изготовления люминесцентных трубок и все такое прочее.
Вообще говоря, конкретный телевизор это, в терминологии JavaScript, не объект, а экземпляр объекта. Объектом является комплект документации, по которой на заводе изготовляется продукция. Все телевизоры, которые сходят с конвейера, имеют одни и те же свойства изображения и одни и те же методы управления этими свойствами.
То же и в программировании. Объект это шаблон, документация. Экземпляр объекта это рабочая копия.
Программист Сидоров придумал новый объект Rectangle. Он сообщил коллегам следующую информацию.
Объект Rectangle | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Объект служит для работы с прямоугольниками. Для создания экземпляра
объекта нужно написать:
Когда экземпляр объекта создан, можно использовать следующие методы и свойства:
Пример использования
|
Что сообщил Сидоров коллегам? Он сообщил интерфейс своего объекта, то есть информацию, необходимую для взаимодействия с объектом.
Сидоров не показал друзьям программные коды функций square, perimeter, radius. Не сказал он и о вспомогательной функции sqrt, которая была написана для вычисления квадратного корня (эту функцию использует у Сидорова метод radius). Не сказал Сидоров и про переменную temp, которая потребовалась объекту для промежуточных вычислений.
Другими словами, Сидоров не показал внутреннее устройство своего объекта. Да и зачем коллегам знать это? Сидоров программист хороший, все свои коды тщательно проверяет, значит, можно пользоваться только интерфейсом, не заглядывая к Сидорову на кухню.
Интерфейс объекта это доступные для использования переменные и функции объекта.
Внутреннее устройство объекта это описание переменных и функций внутри объекта на языке программирования (кухня Сидорова).
Аналогия с телевизором: интерфейс это пульт управления. Внутреннее устройство это электронные потроха в ящике.
В языке JavaScript много встроенных объектов. Их не надо программировать, они заложены в сам язык. Это означает, что коды этих объектов входят в состав программных кодов браузера. Программист должен знать интерфейсы этих объектов, уметь создавать экземпляры, и тогда он сможет использовать встроенные объекты по своему усмотрению.
JavaScript позволяет программировать новые объекты и менять алгоритм работы встроенных. Это очень удобно и привлекательно для программиста. Далее в книге будет много примеров на эту тему, но сначала рассмотрим работу нескольких встроенных объектов (более подробный список приводится в справочном разделе в конце книги).
Начнем практическое рассмотрение встроенных объектов языка JavaScript с очень полезного объекта Date. Этот объект используется для работы с датой и временем.
Для создания экземпляра объекта (не только объекта Date, но и любого другого) в языке JavaScript используется ключевое слово new:
var now = new Date();
Теперь переменная now является экземпляром объекта Date и содержит текущую дату и время.
В общем случае экземпляр образуется следующим образом:
var переменная = new Date(параметры);
Возможно указание следующих параметров:
Параметры | Пример | Описание |
---|---|---|
Пусто. |
var now = new Date(); |
Экземпляр now содержит текущую дату и время. |
Целочисленные значения для года, месяца и дня. |
var birthday = new Date(1954,1,8); |
Экземпляр birthday содержит дату, равную 8 февраля 1954 года (нумерация месяцев начинается с нуля). |
Целочисленные значения для года, месяца, дня, часа, минуты, секунды. |
var bell = new Date(2003,0,14,12,20,0); |
Экземпляр bell содержит дату и время, равные 12 часам 20 минутам 14 января 2003 года. |
После того, как экземпляр объекта Date создан, можно узнать, записанные в нем данные, а можно их и менять. Для этого существуют многочисленные методы, список которых приводится в справочнике.
Имя метода объекта (вспомним, что метод в терминологии JavaScript это функция) отделяется от имени экземпляра точкой.
Можно написать:
var year = bell.getYear();
Переменная year получит значение 2003.
Рассмотрим несколько простых скриптов с объектом Date.
<SCRIPT language=JavaScript> <!-- var now = new Date(); alert("Сегодн\я: "+now.getDate()+"/"+(now.getMonth()+1)+"/"+ now.getYear()+"\n"+ "Сейчас: "+now.getHours()+":"+now.getMinutes()); //--> </SCRIPT> |
<SCRIPT language=JavaScript> <!-- // Текущая дата и время. var now = new Date(); // Начало текущего года. var begin = new Date(now.getYear(),0,1); // Число миллисекунд от начала года. var d = now.getTime() - begin.getTime(); // Число миллисекунд в дне. var msPerDay = 24*60*60*1000; // Поделим на количество миллисекунд в сутках. d /= msPerDay; // Покажем результат. alert("Прошло " + Math.floor(d) + " дней с начала года"); //--> </SCRIPT> |
Замечание о записи Math.floor(x). Встроенный объект Math предлагает различные математические функции и константы. Особенность этого объекта в том, что он существует в единственном экземпляре, который имеет то же имя Math. Программист не может создавать новые экземпляры этого объекта. Правда, в этом и нет необходимости. Метод floor(x) объекта Math возвращает ближайшее целое число, меньшее или равное аргументу (смотрите методы и свойства объекта Math в справочнике).
Этот объект предназначен создания массивов данных. Массив это упорядоченный набор элементов. Доступ к отдельному элементу производится по имени и индексу (номеру). Нумерация элементов в JavaScript начинается с нуля.
dayNames = new Array("воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота");
Для доступа к отдельным элементам массива используют конструкцию:
имя_массива[индекс]
<SCRIPT language=JavaScript> <!-- // Название месяцев в родительном падеже. var monthNames = new Array("\январ\я", "феврал\я", "марта", "апрел\я", "ма\я", "июн\я", "июл\я", "августа", "сент\ябр\я", "окт\ябр\я", "но\ябр\я", "декабр\я"); // Название дней недели. var dayNames = new Array("воскресенье", "понедельник", "вторник", "среда", "четверг", "п\ятница", "суббота"); // Текущая дата и время. var toDay = new Date(); // Формирование строки вывода. var str = "Cегодня: "; // Добавим в строку день месяца. str += toDay.getDate() + " "; // Добавим в строку название месяца. str += monthNames[toDay.getMonth()] + " "; // Добавим в строку год. str += toDay.getYear() + " года, "; // Добавим день недели. str += dayNames[toDay.GetDay()] + "\n"; // Добавим время. str += "Сейчас: " + toDay.getHours() + ":" + toDay.getMinutes() + ":" + toDay.getSeconds(); // Покажем строку. alert(str); //--> </SCRIPT> |
Длина массива (число элементов в нем) может меняться во время работы программы:
var f = new Array(); // Сейчас массив пуст. f[0] = 1; // В массиве один элемент. f[1] = 1; // В массиве два элемента. f[2] = f[0]+f[1]; // В массиве три элемента. f[5] = 8; // В массиве шесть элементов f[0],...,f[5].
Замечание. Два цикла рассмотренного примера можно объединить в один:
var max = a; for(i=0; i<num; i++) { set[i] = Math.floor(a + (b-a+1)*Math.random()); if(set[i] > max) max = set[i]; }
До сих пор мы пользовались методами объектов и еще ни разу их свойствами.
Вспомним, что свойства объекта это, в терминологии JavaScript, те интерфейсные переменные, которые доступны пользователю объекта.
На самом деле, конечно, речь не об объекте, а о конкретном экземпляре объекта. Для обращения к свойствам указывается имя экземпляра объекта и через точку имя свойства, например:
<SCRIPT language=JavaScript> <!-- var set = new Array("Горбунков", "Семен", "Семенович"); alert (set.length); //--> </SCRIPT> |
Свойство length содержит число элементов массива его длину.
Язык JavaScript допускает много вольностей при обращении с объектами. Так, например, можно задать экземпляр массива без ключевого слова new и имени объекта Array:
var set = [1, 4, 9, 16, 25, 36];
Конечно, браузер, просматривая такую запись, все равно создает экземпляр объекта Array, точно такой же, как и при записи:
var set = new Array(1, 4, 9, 16, 25, 36);
В предыдущих уроках мы часто строили экземпляры объекта String, даже не подозревая об этом. Такая запись:
var title = "Старик, упавший с каланчи";
совершенно эквивалентна записи:
var title = new String("Старик, упавший с каланчи");
Для работы со встроенными объектами JavaScript удобно иметь под рукой справочник. Он приводится в конце этой книги.
Ниже располагаются ссылки на описание свойств и методов встроенных объектов в этом справочнике:
![]() |
Нажмите кнопку Сброс, затем выберите верные ответы на вопросы.
Нажмите кнопку Сброс, затем приступайте к решению.
![]() |