Разработчики серверных, клиентских или настольных приложений на JavaScript нередко сталкиваются с проблемами, связанными с объектами, функциями, наследованием и другими особенностями этого языка. Какие же приемы разработки приложений на JavaScript являются наиболее удачными? Данная книга дает ответ на этот вопрос, предлагая большое количество различных шаблонов программирования на JavaScript, таких как "единственный объект" (singleton), "фабрика" (factory), "декоратор" (decorator) и другие. Можно сказать, что они являются не только методами решения наиболее типичных задач разработки ПО, но и заготовками решений для целых категорий таких задач. Использование шаблонов при программировании на языке javascript имеет свои особенности. Некоторые из них, разработанные с позиций языков со строгим контролем типов, таких как C++ и Java, не могут непосредственно применяться в языках с динамической типизацией, таких как JavaScript. Для таких шаблонов в языке javascript имеются более простые альтернативы. Написанная экспертом по языку javascript Стояном Стефановым - ведущим специалистом компании Yahoo! и создателем инструмента оптимизации производительности веб-страниц YSlow 2.0, - книга включает практические советы по реализации каждого из рассматриваемых шаблонов с примерами программного кода. Автор также приводит антишаблоны - приемы программирования, которых следует по возможности избегать.
Предисловие Глава 1. Введение Шаблоны JavaScript: концепции JavaScript - объектно-ориентированный язык В JavaScript отсутствуют классы Прототипы Среда выполнения ECMAScript 5 JSLint Консоль Глава 2. Основы Создание простого в сопровождении программного кода Минимизация количества глобальных переменных Проблемы, связанные с глобальными переменными Побочные эффекты, возникающие в отсутствие объявления var Доступ к глобальному объекту Шаблон единственной инструкции var Подъем: проблемы с разбросанными переменными Циклы for Циклы for-in Расширение встроенных прототипов (в том числе нежелательное) Шаблон switch Избегайте неявного приведения типов Не используйте eval() Преобразование строки в число с помощью parselnt() Соглашения по оформлению программного кода Отступы Фигурные скобки Местоположение открывающей скобки Пробелы Соглашения по именованию Заглавные символы в именах конструкторов Выделение слов Другие шаблоны именования Комментарии Документирование API Пример использования YUIDoc Пишите так, чтобы можно было читать Оценка коллегами Сжатие... при подготовке к эксплуатации Запуск JSLint В заключение Глава 3. Литералы и конструкторы Литералы объектов Синтаксис литералов объектов Создание объектов с помощью конструкторов Недостатки конструктора Object Собственные функции-конструкторы Значения, возвращаемые конструкторами Шаблоны принудительного использования new Соглашения по именованию Использование ссылки that Конструкторы, вызывающие сами себя Литералы массивов Синтаксис литералов массивов Странности конструктора Array Проверка массивов JSON Обработка данных в формате JSON Литералы регулярных выражений Синтаксис литералов регулярных выражений Объекты-обертки значений простых типов Объекты Error В заключение Глава 4. Функции Основы Устранение неоднозначностей в терминологии Объявления и выражения: именаи подъем Свойство name функций Подъем функций Функции обратного вызова Пример использования функции обратного вызова Функции обратного вызова и их области видимости Обработчики асинхронных событий Предельное время ожидания Функции обратного вызова в библиотеках Возвращение функций Самоопределяемые функции Немедленно вызываемые функции Параметры немедленно вызываемых функций Значения, возвращаемые немедленно вызываемыми функциями Преимущества и особенности использования Немедленная инициализация объектов Выделение ветвей, выполняющихся на этапе инициализации... Свойства функций - шаблон мемоизации Объекты с параметрами Каррирование Применение функций Частичное применение Каррирование Когда использовать каррирование В заключение Глава 5. Шаблоны создания объектов Пространство имен Универсальная функция для создания пространства имен Объявление зависимостей Частные свойства и методы Частные члены Привилегированные методы Нежелательный доступ к частным членам Частные члены и литералы объектов Частные члены и прототипы Объявление частных функций общедоступными методами Шаблон "модуль" Шаблон открытия модуля Модули, создающие конструкторы Импортирование глобальных переменных в модули Шаблон изолированного пространства имен Глобальный конструктор Добавление модулей Реализация конструктора Статические члены Общедоступные статические члены Частные статические члены Объекты-константы Шаблон цепочек Достоинства и недостатки шаблона цепочек Метод method() В заключение Глава 6. Шаблоны повторного использования программного кода Классические и современные шаблоны наследования Ожидаемый результат при использовании классического наследования Классический шаблон № 1: шаблон по умолчанию Обход цепочки прототипов Недостатки шаблона № 1 Классический шаблон № 2: заимствование конструктора Цепочка прототипов Множественное наследование при заимствовании конструкторов Достоинства и недостатки шаблона заимствования конструктора Классический шаблон № 3: заимствование и установка прототипа Классический шаблон № 4: совместное использование прототипа Классический шаблон № 5: временный конструктор Сохранение суперкласса Установка указателя на конструктор Функция klass() Наследование через прототип Обсуждение Дополнения в стандарте ECMAScript 5 Наследование копированием свойств Смешивание Заимствование методов Пример: заимствование методов массива Заимствование и связывание Function. prototype. bind () В заключение Глава 7. Шаблоны проектирования Единственный объект Использование оператора new Экземпляр в статическом свойстве Экземпляр в замыкании Фабрика Встроенная фабрика объектов Итератор Декоратор Пример использования Реализация Реализация с использованием списка Стратегия Пример проверки данных Фасад Прокси-объект Пример Прокси-объект как кэш Посредник Пример использования шаблона посредника Наблюдатель Пример 1: подписка на журнал Пример 2: игра на нажатие клавиш В заключение Глава 8. Шаблоны для работы с деревом DOM и броузерами Разделение на составные части Работа с деревом DOM Доступ к дереву DOM Манипулирование деревом DOM События Обработка событий Делегирование событий Сценарии, работающие продолжительное время setTimeout() Фоновые вычисления (web workers) Удаленные взаимодействия XMLHttpRequest Формат JSONP Обмен данными с использованием фреймов и изображений Развертывание сценариев JavaScript Объединение сценариев Сжатие и компрессия Заголовок Expires Использование CDN Стратегии загрузки Местоположение элемента <script> Фрагментирование средствами HTTP Динамические элементы <script> для неблокирующей загрузки сценариев Отложенная загрузка Загрузка по требованию Предварительная загрузка сценариев JavaScript В заключение Алфавитный указатель