Как реализуется инкапсуляция в JavaScript
Что проверяют
Go-разработчику этот вопрос задают, когда рядом живёт фронтенд или сервисы на Node.js и от вас ждут умения читать чужой код. Смотрят, знаете ли вы реальные механизмы сокрытия в JS и можете ли сравнить их с моделью Go. Следом часто спрашивают, чем приватность в Go отличается от приватности в классах.
Как отвечать
В JavaScript сокрытие строится на трёх механизмах:
- замыкания: переменная внутри функции-фабрики доступна только возвращённым методам. Это настоящая приватность, но методы создаются заново для каждого объекта;
- приватные члены классов:
#fieldи#method()появились в ES2022. Обращение снаружи даёт синтаксическую ошибку, проверить наличие поля можно через#field in obj. Модификатораprivateв самом JavaScript нет, он есть только в TypeScript и работает лишь при компиляции; - модули: всё, что не экспортировано из ES-модуля, недоступно снаружи.
Сравнение с Go делает ответ сильнее. В Go граница инкапсуляции это пакет, а не тип: идентификатор с маленькой буквы не виден за пределами пакета, но внутри пакета любой код читает неэкспортированные поля любой структуры. Чтобы закрыть целый подкаталог от чужих модулей, есть каталог internal/. Поэтому ближайший аналог пакета Go в JS это ES-модуль, а не #field: оба решают, что наружу, а что внутрь.
Полезная параллель: encoding/json игнорирует неэкспортированные поля, а JSON.stringify так же пропускает #-поля. В обоих языках сокрытие влияет на сериализацию, и об этом забывают, когда отлаживают пустой ответ.
Если с JS вы работаете редко, так и скажите и покажите, что понимаете принцип и умеете провести аналогию. Это честнее уверенного пересказа статей десятилетней давности.
Где спотыкаются
Называют соглашение с подчёркиванием _name приватностью. Это договорённость, поле доступно всем.
Путают private из TypeScript с приватностью в рантайме. После компиляции поле обычное и читается как obj.name, а к #field снаружи не добраться.
Переносят представления из Java на Go и говорят, что маленькая буква делает поле приватным для структуры. Для кода того же пакета оно открыто, и на этом часто ловят.