Синтаксис
Если переменная это коробка, то объект - это как бы шкаф, в котором они лежат, где каждое свойство (поле) объекта играет роль переменной.
// 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
Идея: данные отдельно, функции чистые и возвращают новое состояние.
Итог
- ООП удобно, когда нужно скрыть состояние и поведение внутри сущности.
- ФП удобно, когда важны предсказуемость и лёгкое тестирование.
- На практике часто используют гибрид.