|
К списку всех уроков
ВТОРАЯ СЕРИЯ
Урок 12 - Объектная модель JavaScript
- объекты;
- методы;
- свойства;
- иерархия объектов браузера.
Если Вы любознательны и пытливы, Вам, должно быть, где-нибудь уже попадалась такая аббревиатура: ООП, что значит «объектно-ориентированное программирование». К объектно-ориентированным языкам относится и JavaScript. То есть, «персонажами» или «именами существительными» являются объекты. Но кроме того, у объектов есть ещё свойства («прилагательные») и методы («глаголы»). Вот это всё и составляет объектную модель языка.
Должен предупредить, что с точки зрения теории программирования эти мои объяснения не вполне корректны. Но если я буду объяснять «как надо», боюсь, что меня поймут только программисты (которым объяснять вообще ничего не надо). В дальнейшем, при необходимости, мы исследуем и «подводную часть айсберга», когда Вы будете к этому готовы. Но для особо любознательных могу дать некоторые начальные пояснения (посмотреть).
Классы и прототипы. JavaScript — язык на базе прототипов
Объектно-ориентированные языки на базе классов — такие, как Java и C++ — основаны на концепции двух различных сущностей: классов и экземпляров.
- Класс — это абстракция, определяющая все свойства и методы, которые характеризуют определённый набор объектов. Например, класс Edit может представлять набор всех (уже существующих и ещё не существующих) редактируемых текстовых полей.
- Экземпляр — это образец класса, один из его членов. Например, myTextBox1 может быть экземпляром класса Edit, представляя конкретное текстовое поле в конкретной программе. Экземпляр имеет абсолютно те же самые свойства и методы, что и его родительский класс.
Язык JavaScript построен на базе прототипов, у него нет этих различий: в нем просто имеются объекты. Он содержит понятие prototypical object (прототипичный объект) — объект, используемый как шаблон, из которого получаются начальные свойства для нового объекта. Любой объект может получить свои собственные свойства либо при его создании, либо на этапе прогона. Кроме того, любой объект может быть определён как прототип для другого (дочернего) объекта, давая ему возможность использовать свойства первого (родительского) объекта.
«Прапрадедушкой» всех объектов JavaScript является так называемый глобальный объект (Global), который создается выполняющей системой JavaScript перед выполнением скрипта. Это единственный объект, у которого нет имени, и потому доступ к его свойствам и методам осуществляется без упоминания имени объекта. Поэтому их также называют свойствами и методами верхнего уровня.
Этот объект настолько запрятан, что о нём можно попросту не знать, и в большинстве справочников о нём не упоминается. Я сам долго не знал о его существовании, но логически «вычислил», что нечто подобное должно иметь место. И недавно обнаружил подтверждение догадки в одном из руководств (здесь у меня стояла ссылка на это руководство, но сайт, увы, закрыт).
Закрыть пояснение.
У каждого объекта свои методы и свойства. Бывают свойства и методы, закреплённые за несколькими объектами, и с разными объектами они могут работать по-разному. Но с какими-то объектами они вооще не работают. Как и в обычном языке: бывает жёлтый цвет, и даже жёлтая пресса. Но на «жёлтую температуру»... программа выполнит недопустимую операцию.
Бывает, что объекты превращаются в свойства и методы других объектов. Это тоже встречается в человеческом языке:
Бывает, что объекты превращаются в свойства и методы других объектов. Это тоже встречается в человеческом языке:
рисунок (объект);
рисовать (метод);
нарисованный (свойство).
В английском — ещё нагляднее:
a stone [камень] — объект;
a stone house [каменный дом] — свойство;
to stone house [облицовывать дом камнем] — метод.
Объекты
Объекты бывают
- встроенные (внутренние) — то есть объекты языка JavaScript. К ним относятся:
- String — строка текста;
- Array — массив;
- Date — дата и время;
- Math — математические функции;
- Object — конструктор для создания пользовательских объектов;
- Дополнительные объекты — см. здесь.;
- Global — объект верхнего уровня в иерархии объектов JavaScript;
- Error — создаётся при возникновении ошибок в процессе выполнения скрипта и содержит информацию об ошибке, которая используется операторами обработки исключений;
- Function — прототип всех пользовательских функций;
- Boolean — объектная реализация примитивного булевского значения (типа данных);
- Number — объектная реализация примитивного числового значения (типа данных);
- RegExp — используется для создания регулярных выражений (образцов для поиска заданных комбинаций символов в текстовых строках)
Обо всех дополнительных объектах речь пойдёт в третьей серии уроков, посвящённой «высшему пилотажу».
Закрыть дополнительные объекты.
- объекты браузера — создаются автоматически при загрузке документа в браузер:
- window — объект верхнего уровня в иерархии объектов браузера;
- document — содержит свойства, которые относятся к текущему HTML-документу;
- location — содержит свойства, описывающие местонахождение текущего документа, например, адрес URL;
- navigator — содержит информацию о версии браузера;
- history — содержит информацию обо всех ресурсах, к которым пользователь обращался во время текущего сеанса;
- связанные с тэгами HTML и стилями CSS — в JavaScript большинству тэгов HTML и стилей CSS соответствуют свойства объекта document, которые сами также являются объектами;
- пользовательские объекты — это объекты, которые создаём мы сами с помощью конструктора Object. Для этого нужно поднатореть в программировании. Надеюсь, что когда-нибудь дойдём и до них.
Методы
Методы — это своеобразные «рычаги» для управления объектами. За объектами в JavaScript закреплено множество различных методов. К «высшему пилотажу» относится создание собственных методов для объектов. В коде методы указываются вместе со своими объектами (через точку):
Например:
|
document.write("<p>Это первый абзац.</p>")
|
Свойства
Наличие свойств — специфическая особенность объектно-ориентированных языков. Собственно, наличие свойств и делает объект объектом, «вещью», которая имеет свой «характер» и с которой можно работать. Как и методы, свойства указываются вместе с объектами, через точку. Но параметры свойств ставятся не в скобки, а через оператор назначения или равенства:
объект.свойство = параметр
объект.свойство == параметр
|
Например:
document.images[4].height = 300
navigator.appName == "Netscape"
|
Как определить, когда какой оператор ставить?
Когда мы назначаем свойству его параметр, то ставим присвоение (=).
Когда используем уже заданный параметр, то ставим равенство (==).
Например:
|
if (document.images[4].height == 300) {какая_нибудь_инструкция}
|
Кроме того, есть свойства только для чтения, с уже заданными патаметрами, которые нельзя переназначить. Например, приведённое выше свойство appName объекта navigator. Такие свойства вызываются только через сдвоенный оператор равенства (==).
Понятие иерархии объектов
Это понятие связано со структурой языка (подробнее см. скрытое примечание в начале урока). Вкратце же — есть старшие (родительские) объекты и младшие (дочерние). Все встроенные объекты имеют одного родителя, который предпочитает остаться невидимкой. Поэтому при их использовании (за исключением особо хитрых случаев, о которых речь пойдёт в третьей серии) об иерархии можно не думать и даже не знать.
На сегодняшний день для нас с Вами важна иерархия объектов браузера, поскольку именно с этими объектами работает подавляющее большинство скриптов.
На этой схеме представлена иерархия основных объектов браузера.
Старший объект window обычно не упоминается в коде. Помните, в 1 уроке нам встречался метод alert()? Это метод объекта window, и он записывается без упоминания своего «хозяина». Впрочем, выражение window.alert() тоже не было бы ошибкой. Но «краткость — сестра таланта».
Parent, self, top и frames — это не объекты, а «псевдонимы» объекта window, особенности их употребления мы разберём в дальнейшем.
Дочерний объект location служит для определения адреса страницы. Объект href является его свойством (его имя совпадает с атрибутом тэга <a>, но это разные вещи: атрибут ссылки href не является объектом, дочерним для location)..
Объекты history, navigator и document — также дочерние объекты window. Самый разветвлённый из них — document. Помимо элементов коллекций images и forms, о которых мы говорили в прошлом уроке, он содержит все объекты, связанные с тэгами HTML и стилями CSS.
Свойства элементов коллекций images и forms, в свою очередь, являются дочерними объектами для объектов image и form
Поддержка JavaScript
Многие уже столкнулись с тем, что разные браузеры понимают скрипты по-разному, а то и вовсе не понимают. Поэтому при использовании объектов, их свойств и методов необходимо учитывать разные типы браузеров. Эта проблема наименее «вспаханная», каждый web-кодер находит свои приёмы, иногда появляются маленькие статьи на отдельные темы. Встречались мне большие и «заумные» руководства, в которых даются примечания по совместимости к каждому объекту, но многие данные уже устарели, так как браузеры успели несколько усовершенствоваться. И многое всё равно приходится проверять универсальным методом тык().
Я буду стараться преподносить такие способы, которые работают везде, но в некоторых случаях буду специально оговаривать совместимость. Возможно, постепенно составлю и табличку свойств и методов на предмет совместимости.
Итак, мы узнали:
пока немного: что такое объекты, методы и свойства.
© А. Фролов |