JS объекты основы
Объект в JavaScript — коллекция свойств «ключ–значение», где значением может быть любой тип данных, включая другие объекты и функции.
Зачем нужно
Объекты — базовая структура данных JavaScript: практически всё в языке является объектом или ведёт себя как объект. Они используются для группировки связанных данных и поведения, моделирования предметной области (пользователь, заказ, товар), а также служат основой для прототипного наследования и ООП. Понимание объектов необходимо до изучения классов, замыканий и DOM.
Где используется
- Хранение данных: конфигурации, настройки, ответы API
- Модели предметной области:
user,product,order - Передача именованных параметров в функции (options-объект)
- Пространства имён (namespace): группировка утилит
- Прототипы и наследование через цепочку прототипов
Основной контент
Создание объектов
// Литерал — самый частый способ
const user = {
name: 'Иван',
age: 30,
isAdmin: false,
greet {
return `Привет, я ${this.name}`;
}
};
// Object.create — задаём прототип явно
const base = { toString { return `[${this.name}]`; } };
const obj = Object.create(base);
obj.name = 'test';
console.log(obj.toString()); // "[test]"
// Вычисляемые ключи
const key = 'status';
const order = { [key]: 'pending', [`${key}Code`]: 200 };
Доступ и изменение свойств
const product = { name: 'Ноутбук', price: 50000 };
// Точечная нотация
console.log(product.name); // 'Ноутбук'
product.price = 45000;
// Скобочная нотация — для динамических ключей и ключей с пробелами
const field = 'price';
console.log(product[field]); // 45000
// Проверка наличия свойства
console.log('name' in product); // true
console.log(product.hasOwnProperty('name')); // true (только собственные)
console.log(product.color); // undefined (не выбросит ошибку)
// Optional chaining
const res = product?.category?.id; // undefined, не TypeError
Деструктуризация и spread
const { name, price, discount = 0 } = product; // discount со значением по умолчанию
// Переименование при деструктуризации
const { name: productName } = product;
// Spread — поверхностное копирование
const updated = { ...product, price: 40000 };
// Объединение объектов
const defaults = { color: 'white', size: 'M' };
const custom = { color: 'black' };
const merged = { ...defaults, ...custom }; // { color: 'black', size: 'M' }
Перебор свойств
const config = { host: 'localhost', port: 3000, debug: true };
// for...in — перебирает все перечисляемые свойства включая унаследованные
for (const key in config) {
if (config.hasOwnProperty(key)) {
console.log(`${key}: ${config[key]}`);
}
}
// Object.keys() / values / entries — только собственные перечисляемые
console.log(Object.keys(config)); // ['host', 'port', 'debug']
console.log(Object.values(config)); // ['localhost', 3000, true]
console.log(Object.entries(config)); // [['host','localhost'], ['port',3000], ...]
// Трансформация через entries
const doubled = Object.fromEntries(
Object.entries({ a: 1, b: 2 }).map(([k, v]) => [k, v * 2])
);
// { a: 2, b: 4 }
Дескрипторы и Object.defineProperty
const obj = {};
Object.defineProperty(obj, 'id', {
value: 42,
writable: false, // нельзя переписать
enumerable: false, // не видно в for...in и Object.keys()
configurable: false // нельзя удалить или переопределить
});
console.log(obj.id); // 42
obj.id = 99; // в strict mode — TypeError, иначе тихо игнорируется
Частые ошибки
- Поверхностное копирование через spread:
{ ...obj }не копирует вложенные объекты — они разделяют ссылку. Для глубокого клонирования используйтеstructuredClone. thisтеряется при деструктуризации метода:const { greet } = user; greet—thisбудетundefinedв strict mode. Нужноuser.greet.for...inобходит прототип: безhasOwnPropertyможно получить унаследованные свойства.- Ключи объекта всегда строки или Symbol:
obj[1]иobj['1']— одно и то же свойство.
Связанные темы
Ресурсы
⚡ Источник: Что такое Object в JavaScript согласно спецификации · AsForJS
- 📅 2025-02-03 · YouTube
- Тезисы:
- По спеке Object — это коллекция Property, где каждое Property имеет дескриптор (data или accessor)
- У всех объектов есть internal methods:
[[Get]],[[Set]],[[Delete]],[[OwnPropertyKeys]],[[Prototype Pattern]] - Ordinary Object vs Exotic Object (Array, Function, Proxy — все exotic)
⚡ Источник: Производительность JS Обьекты в V8 · AsForJS
- 📅 2025-02-07 · YouTube
- Тезисы:
- V8 использует Hidden Classes (Shapes) для объектов одинаковой структуры
- Добавление полей в одном порядке = один shape, в разных = разные shapes (полиморфизм)
- Inline Cache работает только при стабильных shapes
⚡ Источник: Производительность V8 объектов в примерах · AsForJS
- 📅 2025-02-11 · YouTube
- Тезисы:
delete obj.propломает shape — объект переходит в dictionary mode- Объявляйте все поля в конструкторе сразу, не накидывайте позже
⚡ Источник: Что Вы не знаете о Assignment Patterns · AsForJS
- 📅 2025-10-18 · YouTube
- Тезисы:
{a, b} = obj— это Assignment Pattern, по спеке отличается от Binding Pattern вlet {a, b} = obj. У них разные грамматики
🎓 Источник: 👶 JavaScript для начинающих 3. Литералы, массивы, объекты
- 📅 2021-10-02 · YouTube
- Тезисы: литералы — синтаксис для прямого создания значений. Объектный литерал
{}— самый частый способ создания. Массив — особый объект с числовыми ключами
🎓 Источник: 💻 Массивы, объекты, классы, прототипы в JavaScript
- 📅 2018-10-04 · YouTube
- Тезисы: объекты и массивы — один тип под капотом. Различие — методы и спец. обработка length