Оглавление
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Задача . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
О книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Типографские соглашения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Использование программного кода примеров . . . . . . . . . . . . . . . . 24
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
ЧАСТЬ 1. ОБЛАСТЬ ВИДИМОСТИ И ЗАМЫКАНИЯ......25
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Глава 1. Что такое область видимости? . . . . . . . . . . . . . . 28
Немного теории компиляторов . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Разбираемся в областях видимости . . . . . . . . . . . . . . . . . . . . . . . 31
Участники . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Туда и обратно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Немного терминологии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Общение Движка с Областью видимости . . . . . . . . . . . . . . . . . . . 36
Упражнение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Вложенная область видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Метафоры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Ошибки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6 Оглавление
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Ответ на упражнение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Глава 2. Лексическая область видимости . . . . . . . . . . . . 44
Стадия лексического анализа . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Поиск...............................................47
Искажение лексической области видимости . . . . . . . . . . . . . . . . . 48
eval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Быстродействие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Глава 3. Функциональные и блочные
области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Области видимости из функций . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Как скрыться у всех на виду . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Предотвращение конфликтов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Функции как области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Анонимные и именованные функциональные выражения . . . . . . . 66
Немедленный вызов функциональных выражений . . . . . . . . . . . . 67
Блоки как области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
try/catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Глава 4. Поднятие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Курица или яйцо? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Компилятор наносит ответный удар . . . . . . . . . . . . . . . . . . . . . . . 84
Сначала функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Оглавление 7
Глава 5. Замыкание области видимости . . . . . . . . . . . . . 90
Просветление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Технические подробности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Теперь я вижу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Циклы и замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Снова о блочной области видимости . . . . . . . . . . . . . . . . . . . . . 102
Модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Современные модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Будущие модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Приложение А. Динамическая область видимости . . . 115
Приложение Б. Полифилы для блочной
области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Traceur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Неявные и явные блоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Быстродействие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Приложение В. Лексическое this . . . . . . . . . . . . . . . . . . 124
ЧАСТЬ 2. THIS И ПРОТОТИПЫ ОБЪЕКТОВ.............. 129
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Глава 6. Что такое this? . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Для чего нужно this? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Путаница . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Сама функция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Область видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Что такое this? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
8 Оглавление
Глава 7. this обретает смысл! . . . . . . . . . . . . . . . . . . . . . 145
Место вызова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Ничего кроме правил . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Связывание по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Неявное связывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Явное связывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Связывание new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Все по порядку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Определение this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Исключения связывания................................167
Игнорирование this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Косвенные ссылки..................................170
Мягкое связывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Лексическое поведение this . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Глава 8. Объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Встроенные объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Содержимое . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Вычисление имен свойств . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Свойства и методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Дублирование объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Дескрипторы свойств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Неизменяемость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
[[Get]] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
[[Put]] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Геттеры и сеттеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Существование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Оглавление 9
Перебор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Глава 9. Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Теория классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Паттерн проектирования «класс» . . . . . . . . . . . . . . . . . . . . . 220
«Классы» JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Механика классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Строительство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Конструктор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Наследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Полиморфизм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Множественное наследование . . . . . . . . . . . . . . . . . . . . . . . . 231
Примеси . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Явные примеси . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Неявные примеси . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Глава 10. Прототипы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
[[Prototype]] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Object.prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Назначение и замещение свойств . . . . . . . . . . . . . . . . . . . . . 247
«Класс» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Функции «классов» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
«Конструкторы» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Механика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Наследование (на основе прототипов) . . . . . . . . . . . . . . . . . . . . 263
Анализ связей «классов» . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Связи между объектами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Создание связей вызовом Create() . . . . . . . . . . . . . . . . . . . . . 273
Связи как резерв? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
10 Оглавление
Глава 11. Делегирование поведения . . . . . . . . . . . . . . . 281
Проектирование, ориентированное на делегирование . . . . . . . . 282
Теория классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Теория делегирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Сравнение моделей мышления . . . . . . . . . . . . . . . . . . . . . . . 292
Классы и объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
«Классы» виджетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Делегирование для объектов Widget . . . . . . . . . . . . . . . . . . . 302
Упрощение архитектуры................................305
Расставание с классами..............................309
Более приятный синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Нелексичность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Интроспекция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Приложение Г. Классы ES6 . . . . . . . . . . . . . . . . . . . . . . . 322
class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Проблемы class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Статический > динамический? . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333