Object

Object

Технический фундамент объектной структуры

Объекты задают форму доменных сущностей, поэтому важны их инварианты:

  • стабильный набор ключей между слоями системы;
  • контроль мутаций и точек изменения данных;
  • явные проверки существования свойств перед использованием;
  • осознанный выбор копирования (поверхностное/глубокое по задаче).

Чем четче модель объекта, тем дешевле поддержка и рефакторинг кода.

Почему object - основной контейнер данных

В приложениях почти все сущности описываются объектами: пользователь, товар, заказ, конфиг, ответ API. Объект объединяет связанные значения по схеме "ключ -> значение".

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

Проверь себя: почему userName, userEmail, userRole в трех переменных сложнее поддерживать, чем один user объект?

Создание объекта и доступ к полям

const user = {
  id: 1,
  name: 'Anna',
  isActive: true,
};

console.log(user.name);
console.log(user['id']);

Доступ возможен через точку и через скобки.

Смотри, что важно: если ключ динамический, используй скобки.

const field = 'name';
console.log(user[field]);

Изменение и добавление свойств

user.isActive = false;
user.email = 'anna@mail.com';

Объекты в JS изменяемы по умолчанию.

Здесь часто путаются: const user не запрещает менять свойства, он запрещает переназначить саму переменную user.

Проверка существования ключа

console.log('name' in user); // true
console.log(user.age === undefined); // true (если нет поля)

Смотри, что важно:

  • obj.key === undefined может быть true, даже если ключ существует, но в нем явно лежит undefined;
  • оператор in проверяет ключ не только в самом объекте, но и в прототипной цепочке.
const obj = { a: undefined };

console.log(obj.a === undefined); // true
console.log('a' in obj); // true
console.log(obj.hasOwnProperty('a')); // true

Для перечисления ключей используют Object.keys.

console.log(Object.keys(user));

Проверь себя: почему проверка obj.key === undefined не всегда равна "ключ точно отсутствует"?

Поверхностное копирование объекта

const original = { theme: 'dark' };
const copy = { ...original };

Это удобно для создания нового объекта без мутации исходного.

Анти-провал: помни, что spread дает поверхностную копию, вложенные объекты останутся общими.

Мини-сценарий: профиль пользователя

function buildProfile(name, email) {
  return {
    name,
    email,
    createdAt: Date.now(),
  };
}

Такой объект легко передавать между слоями: UI -> API -> логика.

Если вход пустой, можно добавить валидацию до сборки объекта.

Частые ошибки новичков

  • Думать, что const делает объект полностью неизменяемым.
  • Не проверять наличие поля перед использованием.
  • Случайно мутировать общий объект в нескольких местах.
  • Смешивать в одном объекте несвязанные данные.

Анти-провал: у объекта должна быть понятная ответственность (например, только данные профиля, а не "всё подряд").

Что будет, если изменить вход

Если в buildProfile передать пустой email, объект все равно создастся. Это значит, что объект как структура не заменяет бизнес-валидацию. Сначала проверяй данные, потом формируй объект.

Проверь себя: где лучше валидировать email - до создания объекта или после? Почему?

Краткий итог

  • object - базовая структура для связанных данных в JavaScript.
  • Свойства можно читать, менять и добавлять динамически.
  • const защищает ссылку, но не защищает поля от мутаций.
  • Для безопасного кода нужны проверки ключей и аккуратная работа с копиями.
  • Хорошая объектная модель делает данные понятными и снижает хаос в логике приложения.