Перейти к основному содержимому

Синтаксис

Если переменная это коробка, то объект - это как бы шкаф, в котором они лежат, где каждое свойство (поле) объекта играет роль переменной.

// syntax (key, property, field): value
{
key1: value1,
key2: value2,
...,
keyN: valueN,
}
// Создание объекта (I способ - обычное через переменную)
const someObj = {
key1: 'string',
key2: 123,
key3: null,
key4: undefined,
key5: true,
key6: true,
key7: [],
key8: {},
key9: () => '123', // метод (свойство хранить функцию)
'key 10': 'This is value of js-object property',
};
// Создание объекта (II способ - через конструктор)
const someObj = new Object({ title: 'Война и мир', author: 'Лев Толстой' });
// Создание объекта (III способ - более гибкое создание объекта с прототипированим
// (скрытые поля, сеньёрская тема))
const someObj = Object.create(
{
x: 1,
y: 2,
},
{
title: { value: 'Война и мир' },
author: { value: 'Лев Толстой' },
},
);

Объекты также могут иметь вложенные объекты в виде свойств и вообще включать в себя очень разветвленную структуру.

Раньше в JS можно было создавать поля объектов строками, но сейчас это уже плохая практика.

// лучше так не делать
const a = {
'свойство 1': 1,
'свойство 2': 2,
};

// нужно так
const a = {
property1: 1,
property2: 2,
};

Также свойства в одном объекте не должны иметь одинаковые названия, JS на это ругаться не будет, просто будет перезапись этого поля, а TypeScript будет ругаться.

const a = {
property1: 1,
property1: 2, // так нельзя
};

Обращение к свойству объекта

// I способ (через точку - оператор доступа)
someObj.key1; // 'string'
// II способ (через [] и строковое поле)
someObj['key1']; // 'string'

// II способ всегда используется при строковом значении полей объекта
someObj['key 10']; // 'This is value of js-object property'
// III способ через переменную
const fieldName = 'key 10';
someObj[fieldName]; // 'This is value of js-object property'
// вызов метода
someObj.key9(); // '123'

// вызов несуществующего метода
someObj.key1(); // Будет ошибка "TypeError: person.key1 is not a function"
// Обращение к несуществующему полю (TS будет ругаться)
someObj.key10; // undefined

Добавление, изменение, удаление полей

const person = {
name: 'Jack',
lastName: 'Jackson',
age: 35,
city: 'New York, USA',
isComputerUser: true,
};

// Добавление поля (JS не ругается, TS будет)
person.isAlive = true;
person.isAlive; // true
// Изменение поля (Если будет другой тип данных, то TS будет ругаться)
person.city = 'Chicago, USA';
person.city; // 'Chicago, USA'
// Удаление поля - I способ через ключевое слово delete
delete person.isComputerUser;

// Удаление поля - II способ, можно присвоить undefined
person.isComputerUser = undefined;

Вложенные объекты

let person = {
wife: {
name: 'Inna',
sername: 'Begunova',
age: 33,
},
};

console.log(person.wife.name); // 'Inna'

// или так
console.log(person['wife']['name']); // 'Inna'

Boolean

Любой объект, даже пустой всегда true.

Boolean({}); // true

Сейчас в основном в разработке используют так называемые "чистые функции (pure functions)" и функциональное программирование. Написание именно методов объектов уже ушло в прошлое, было сильно востребовано ранее до стандарта ES6 и стрелочных функций. Переход React на функциональные компоненты.

  • Объекто-ориентированное программирование (ООП), классы 👎
  • Функциональное программирование, чистые функции 👍

Виды программирования

ООП (объектно‑ориентированное)*

  • Идея: объединить данные и поведение в объектах/классах.
  • Плюсы: инкапсуляция, удобно моделировать предметную область, масштабируется в больших системах.
  • Минусы: сложнее тестировать из‑за состояния, this и наследование иногда усложняют поддержку.

ФП (функциональное)

  • Идея: чистые функции + неизменяемые данные.
  • Плюсы: проще тестировать, меньше скрытых эффектов, предсказуемость.
  • Минусы: иногда больше шаблонного кода, сложнее “натянуть” на некоторые модели.

Как в реальности

В JavaScript почти всегда смешанный стиль:

  • данные часто как объекты (JSON)
  • логика — чистые функции
  • классы/методы — там, где это удобно (например, UI, модели, сервисы)
  • Главное — не “выбрать сторону”, а уметь применять оба подхода.

Пример ООП‑подход (состояние внутри объекта)*

class Cart {
constructor() {
this.items = [];
}
add(item) {
this.items.push(item);
}
total() {
return this.items.reduce((sum, i) => sum + i.price, 0);
}
}

// создаём экземпляр класса
const cart = new Cart();

// добавляем товары
cart.add({ name: 'Book', price: 10 });
cart.add({ name: 'Pen', price: 5 });

// узнаём цену
cart.total(); // 15

Идея: данные + методы в одном объекте, состояние внутри класса (инкапсуляция).


Пример ФП‑подход (чистые функции)

// объявляем массив для состояния
let items = [];

// функции-обработчики
const addItem = (items, item) => [...items, item];
const total = items => items.reduce((sum, i) => sum + i.price, 0);

// добавляем товары
items = addItem(items, { name: 'Book', price: 10 });
items = addItem(items, { name: 'Pen', price: 5 });

// узнаём цену
total(items); // 15

Идея: данные отдельно, функции чистые и возвращают новое состояние.


Итог

  • ООП удобно, когда нужно скрыть состояние и поведение внутри сущности.
  • ФП удобно, когда важны предсказуемость и лёгкое тестирование.
  • На практике часто используют гибрид.