Menu
Coddy logo textTech

Инкапсуляция

Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 17 из 56.

Инкапсуляция — это процесс объединения данных внутри класса в одну единицу.

Это помогает наложить ограничения на прямой доступ к данным класса, что в конечном итоге помогает нам предотвратить любое случайное изменение данных. 

Давайте посмотрим на инкапсуляцию в действии на простом примере. Создайте базовый объект с публичными свойствами:

const user = {
  name: "John",
  email: "john@example.com"
};

Любой может напрямую обращаться к этим свойствам и изменять их:

user.name = "Jane"; // Легко изменить извне
console.log(user.email); // Легко получить доступ извне

Более инкапсулированный подход использует замыкания для скрытия данных:

function createUser(name, email) {
  // Эти переменные являются приватными (инкапсулированными)
  let userName = name;
  let userEmail = email;
  
  // Возвращаем объект с методами для взаимодействия с приватными данными
  return {
    getName: function() {
      return userName;
    },
    getEmail: function() {
      return userEmail;
    },
    setName: function(newName) {
      userName = newName;
    }
  };
}
const encapsulatedUser = createUser("John", "john@example.com");

Теперь для взаимодействия с данными:

console.log(encapsulatedUser.getName()); // "John"
encapsulatedUser.setName("Jane");
console.log(encapsulatedUser.getName()); // "Jane"

// Невозможно получить прямой доступ к данным
console.log(encapsulatedUser.userName); // undefined
challenge icon

Задание

Вам предоставлен код, который использует инкапсуляцию для защиты пользовательских данных. Ваша задача — добавить метод getAge() для доступа к возрасту.

Тесты проверят следующее:

  • Метод getAge() существует
  • Он возвращает правильный возраст
  • Информация о возрасте остается приватной

Ожидаемый результат:

john_doe

25

Шпаргалка

Инкапсуляция — это процесс объединения данных внутри класса в одну единицу и ограничения прямого доступа к этим данным, что предотвращает их случайное изменение.

Без инкапсуляции свойства объекта доступны публично:

const user = {
  name: "John",
  email: "john@example.com"
};

user.name = "Jane"; // Can be modified directly
console.log(user.email); // Can be accessed directly

Использование замыканий для инкапсуляции данных:

function createUser(name, email) {
  // Private variables (encapsulated)
  let userName = name;
  let userEmail = email;
  
  // Public methods to interact with private data
  return {
    getName: function() {
      return userName;
    },
    getEmail: function() {
      return userEmail;
    },
    setName: function(newName) {
      userName = newName;
    }
  };
}

const encapsulatedUser = createUser("John", "john@example.com");
console.log(encapsulatedUser.getName()); // "John"
encapsulatedUser.setName("Jane");
console.log(encapsulatedUser.getName()); // "Jane"
console.log(encapsulatedUser.userName); // undefined (private data not accessible)

Попробуйте сами

import { createUser } from './createUser.js';

// Тестовый код — не изменять
const user = createUser("john_doe", 25);
console.log(user.getUsername()); // Должен вывести "john_doe"
console.log(user.getAge());      // Должен вывести 25

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование