Хотя JavaScript поддерживает тип данных, который мы называем объектом, в нем нет формального понятия класса. Это в значительной степени отличает его от классических объектно_ориентированных языков программирования, таких как C++ и Java. Общая черта объектно_ориентированных языков – это их стро_ гая типизация и поддержка механизма наследования на базе классов. По этому критерию JavaScript легко исключить из числа истинно объектно_ориентиро_ ванных языков. С другой стороны, мы видели, что JavaScript активно использу_ ет объекты и имеет особый тип наследования на базе прототипов. JavaScript – это истинно объектно_ориентированный язык. Он был реализован под влиянием некоторых других (относительно малоизвестных) объектно_ориентированных языков, в которых вместо наследования на основе классов реализовано наследо_ вание на базе прототипов.
Несмотря на то что JavaScript – это объектно_ориентированный язык, не бази_ рующийся на классах, он неплохо имитирует возможности языков на базе клас_ сов, таких как Java и C++. Я употребил термин «класс» в этой главе неформаль_ но. В данном разделе проводятся более формальные параллели между JavaScript и истинным наследованием на базе классов в таких языках, как Java и C++.1
Начнем с того, что определим некоторые базовые термины. Объект, как мы уже видели, – это структура данных, которая содержит различные фрагменты име_ нованных данных, а также может содержать методы для работы с этими фраг_ ментами данных. Объект группирует связанные значения и методы в единый удобный набор, который, как правило, облегчает процесс программирования, увеличивая степень модульности и возможности для многократного использова_ ния кода. Объекты в JavaScript могут иметь произвольное число свойств, и свой_ ства могут добавляться в объект динамически. В строго типизированных язы_ ках, таких как Java и C++, это не так. В них любой объект имеет предопределен_ ный набор свойств2, а каждое свойство имеет предопределенный тип. Имитируя объектно_ориентированные приемы программирования при помощи JavaScript_
1 Этот раздел рекомендуется прочитать даже тем, кто незнаком с этими языками и упомянутым стилем объектно_ориентированного программирования.
2 Обычно в Java и C++ они называются «полями», но здесь мы будем называть их свойствами, поскольку такая терминология принята в JavaScript.
9.3. Объектно*ориентированный язык JavaScript
объектов, мы, как правило, заранее определяем набор свойств для каждого объ_ екта и тип данных, содержащихся в каждом свойстве.
В Java и C++ класс определяет структуру объекта. Класс точно задает поля, ко_ торые содержатся в объекте, и типы данных этих полей. Он также определяет методы для работы с объектом. В JavaScript нет формального понятия класса, но, как мы видели, в этом языке приближение к возможностям классов реализу_ ется с помощью конструкторов и объектов_прототипов.
И JavaScript, и объектно_ориентированные языки, основывающиеся на классах, допускают наличие множества объектов одного класса. Мы часто говорим, что объект – это экземпляр класса. Таким образом, одновременно может существо_ вать множество экземпляров любого класса. Иногда для описания процесса созда_ ния объекта (т. е. экземпляра класса) используется термин создание экземпляра.
В Java обычная практика программирования заключается в присвоении клас_ сам имен с первой прописной буквой, а объектам – со всеми строчными. Это со_ глашение помогает отличать классы и объекты в исходных текстах. Этому же соглашению желательно следовать и при написании программ на языке Java_ Script. Например, в предыдущих разделах мы определили класс Rectangle и соз_ давали экземпляры этого класса с именами, такими как rect.
Члены Java_класса могут принадлежать одному из четырех основных типов: свойства экземпляра, методы экземпляра, свойства класса и методы класса. В сле_ дующих разделах мы рассмотрим различия между этими типами и поговорим о том, как JavaScript имитирует эти типы.