--- sidebar_position: 4 --- # Приватные и защищённые методы и свойства В терминах ООП отделение внутреннего интерфейса от внешнего называется инкапсуляция. Это даёт следующие выгоды: **Защита для пользователей, чтобы они не выстрелили себе в ногу** Если мы чётко отделим внутренний интерфейс, то разработчик класса сможет свободно менять его внутренние свойства и методы, даже не информируя пользователей… #### Поддерживаемость Если вы разработчик такого класса, то приятно знать, что приватные методы можно безопасно переименовывать, их параметры можно изменять и даже удалять, потому что от них не зависит никакой внешний код. В новой версии вы можете полностью всё переписать, но пользователю будет легко обновиться, если внешний интерфейс остался такой же. ## Внутренний и внешний интерфейсы В объектно-ориентированном программировании свойства и методы разделены на 2 группы: - Внутренний интерфейс – методы и свойства, доступные из других методов класса, но не снаружи класса. - Внешний интерфейс – методы и свойства, доступные снаружи класса. Итак, всё, что нам нужно для использования объекта, это знать его внешний интерфейс. Мы можем совершенно не знать, как это работает внутри, и это здорово. В JavaScript есть два типа полей (свойств и методов) объекта: - Публичные: доступны отовсюду. Они составляют внешний интерфейс. До этого момента мы использовали только публичные свойства и методы. - Приватные: доступны только внутри класса. Они для внутреннего интерфейса. Защищённые поля не реализованы в JavaScript на уровне языка, но на практике они очень удобны, поэтому их эмулируют. ## Защищённое свойство «waterAmount» Защищённые свойства обычно начинаются с префикса `_`. Это не синтаксис языка: есть хорошо известное соглашение между программистами, что такие свойства и методы не должны быть доступны извне. Большинство программистов следуют этому соглашению. ## Приватное свойство «#waterLimit» Есть новшество в языке JavaScript, которое почти добавлено в стандарт: оно добавляет поддержку приватных свойств и методов. Приватные свойства и методы должны начинаться с #. Они доступны только внутри класса. Например, в классе ниже есть приватное свойство #waterLimit и приватный метод #checkWater для проверки количества воды На уровне языка # является специальным символом, который означает, что поле приватное. Мы не можем получить к нему доступ извне или из наследуемых классов. Приватные поля не конфликтуют с публичными. У нас может быть два поля одновременно – приватное #waterAmount и публичное waterAmount.