Информация о книге
- Автор: Рафаэлло Чекко
- ISBN: 978-5-4461-0034-7
- Год издания: 2013
- Издательство: Питер
Язык JavaScript имеет незаслуженно сомнительную славу. Немало написано о том, что он обладает весьма ограниченными возможностями в области объектно-ориентированного программирования (ООП). Некоторые авторы даже не признают за JavaScript права называться объектно-ориентированным языком (но это самый настоящий объектно-ориентированный язык). Несмотря на очевидное синтаксическое сходство JavaScript и применяемых в ООП языков, основанных на классах, в JavaScript отсутствует оператор Class (или его эквивалент).
Здесь также нет никакого очевидного способа внедрения популярных методологии ООП, в частности наследования (многократного использования кода) и инкапсуляции. К тому же JavaScript характеризуется слабой типизацией, не имеет компилятора. В такой ситуации вы получаете слишком мало предупреждений об ошибках и можете не заметить, что дела пошли плохо. Этот язык прощает вам практически все и всегда. Благодаря этому нюансу ничего не подозревающий программист одновременно приобретает и широчайшую свободу действий, и километровую нить Ариадны, позволяющую выбраться из любого лабиринта.
Программист, привыкший работать с более классическим и строго регламентированным языком, просто теряется, сталкиваясь с блаженным неведением JavaScript относительно практически любого феномена программирования. Функции и переменные по умолчанию являются глобальными, а если вы пропустите где-нибудь точку с запятой, не случится ничего страшного. Скорее всего, причины подобного отношения программистов заключаются в недопонимании того, что же такое JavaScript. Написать приложение на JavaScript будет гораздо проще, если программист усвоит две фундаментальные истины:
- JavaScript — это язык, основанный не на классах;
- хороший код может получиться и без применения ООП, основанного на классах.
Некоторые программисты пытаются воспроизводить на почве JavaScript классовую природу таких языков, как С++, но подобные упражнения равносильны заталкиванию квадратного колышка в круглое отверстие. В каких-то случаях это удается, но только результат получается вымученным.
Идеального языка программирования не существует, и можно даже утверждать, что мнимое превосходство определенных языков программирования (а в сущности — мнимое превосходство самой объектно-ориентированной модели) — это история, напоминающая казусе «новым платьем короля». По моему опыту, в программах, написанных на С++, Java или РНР, встречается не меньше ошибок или проблем, чем в проектах, где применяется только JavaScript. На самом деле (глубокий вдох) можно предположить, что благодаря гибкой и выразительной при роде JavaScript проекты на этом языке пишутся быстрее, чем на каком-либо другом.
К счастью, большинство недостатков, присущих JavaScript, несложно избежать. Но не путем насильственного превращения его в нескладную имитацию другого языка, а благодаря использованию исключительной гибкости, присущей JavaScript и позволяющей обходить сложные ситуации. Классовая природа других языков иногда приводит к выстраиванию громоздких иерархических структур, а также к неуклюжести кода, в котором накапливается слишком «много букв». В JavaScript действуют другие принципы наследования, которые не менее полезны, чем в классовых языках, но при этом замечательно легки.
Существует большое количество способов организации наследования в JavaScript — и для такого пластичного языка это неудивительно. В следующем коде используется наследование через прототипы (Prototypal Inheritance) — мы создаем объект Pet (Домашний любимец), а потом объект Cat, наследующий от него. Такой способ наследования часто рассматривается в учебниках по JavaScript и считается классической техникой этого языка.