Урок 05

Объекты: методы

Полный обзор методов Object и работы с объектами.

Object.keys, values, entries

const user = { name: 'Алиса', age: 25 };

Object.keys(user);    // ['name', 'age']
Object.values(user);  // ['Алиса', 25]
Object.entries(user); // [['name', 'Алиса'], ['age', 25]]

Object.fromEntries

Обратное преобразование:

Object.fromEntries([
    ['name', 'Алиса'],
    ['age', 25],
]);
// { name: 'Алиса', age: 25 }

Полезно для преобразования Map в объект:

const map = new Map([['a', 1], ['b', 2]]);
Object.fromEntries(map); // { a: 1, b: 2 }

Object.assign

Копирует свойства из источников в цель:

Object.assign({}, a, b);

Мутирует первый аргумент:

const target = {};
Object.assign(target, { a: 1 }); // target = { a: 1 }

Object.freeze / isFrozen

const obj = Object.freeze({ a: 1 });
obj.a = 2;         // молча игнорируется (или ошибка в strict)
Object.isFrozen(obj); // true

Object.seal / isSealed

Запрещает добавление и удаление, разрешает изменение:

const obj = Object.seal({ a: 1 });
obj.a = 2;      // ок
obj.b = 3;      // не добавится
delete obj.a;   // не удалится

Object.preventExtensions

Запрещает добавление новых свойств:

const obj = Object.preventExtensions({ a: 1 });
obj.b = 2; // не добавится

Object.getOwnPropertyNames

Все собственные ключи, включая неперечисляемые:

Object.getOwnPropertyNames({ a: 1 }); // ['a']
Object.getOwnPropertyNames([1, 2]);   // ['0', '1', 'length']

Object.getOwnPropertyDescriptor

Информация о свойстве:

const desc = Object.getOwnPropertyDescriptor({ a: 1 }, 'a');
// { value: 1, writable: true, enumerable: true, configurable: true }

Object.defineProperty

Точное определение свойства:

const obj = {};

Object.defineProperty(obj, 'a', {
    value: 1,
    writable: false,
    enumerable: false,
    configurable: false,
});

obj.a = 2; // не сработает

Для геттеров и сеттеров:

const obj = {
    _value: 0,
};

Object.defineProperty(obj, 'value', {
    get() { return this._value; },
    set(v) { this._value = v; },
});

Или через синтаксис:

const obj = {
    _value: 0,
    get value() { return this._value; },
    set value(v) { this._value = v; },
};

Object.create

Создание с указанным прототипом:

const proto = { greet() { return 'привет'; } };
const obj = Object.create(proto);
obj.greet(); // 'привет'

Без прототипа:

const obj = Object.create(null);
obj.toString; // undefined

Object.is

Строгое сравнение с учётом NaN и -0:

Object.is(NaN, NaN);   // true
Object.is(0, -0);      // false
NaN === NaN;           // false
0 === -0;              // true

Object.hasOwn

ES2022, безопасная проверка:

Object.hasOwn({ a: 1 }, 'a');       // true
Object.hasOwn({ a: 1 }, 'toString'); // false

Object.groupBy

ES2024:

Object.groupBy(users, (u) => u.role);
// { admin: [...], user: [...] }

Map.groupBy

Если ключи не строки:

Map.groupBy(items, (item) => item.category);

Object.getPrototypeOf

Object.getPrototypeOf({}); // Object.prototype
Object.getPrototypeOf([]); // Array.prototype

Object.setPrototypeOf

const obj = {};
Object.setPrototypeOf(obj, { greet() {} });

Медленно. Лучше Object.create.

Итоги

  • keys, values, entries — обзор
  • fromEntries — обратно
  • assign — слияние
  • freeze, seal — защита
  • defineProperty — точный контроль
  • create — с прототипом
  • hasOwn — безопасная проверка