Извлечение выбранных полей объекта с доступом только для чтения

Создайте объект выбранных полей и запретите запись. Object.freeze бросает ошибку присваивания только в строгом режиме; для гарантированной ошибки используйте ловушку set у Proxy.

Короткий ответ

Что ответить на собеседовании

Создайте объект выбранных полей и запретите запись. Object.freeze бросает ошибку присваивания только в строгом режиме; для гарантированной ошибки используйте ловушку set у Proxy.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать функцию getObjectValues, принимающую два аргумента: исходный объект и массив строк‑ключей. Функция должна сформировать и вернуть новый объект, в котором присутствуют лишь те свойства, имена которых указаны в массиве, и их значения. При этом свойства полученного объекта должны быть защищены от изменения – любые попытки записать новое значение должны приводить к ошибке доступа.

const user = {
  name: 'dima',
  age: 24,
  channel: 'SIBERIA CAN CODE - Frontend',
};

const nameAndChannel = getObjectValues(user, ['name', 'channel']);
console.log('@', nameAndChannel);

nameAndChannel.name = 'ne dima'; // error readonly

В решении можно воспользоваться методами Object.defineProperty, Object.defineProperties или Object.freeze для обеспечения неизменяемости свойств.

Ответ

Создайте объект выбранных полей и запретите запись. Object.freeze бросает ошибку присваивания только в строгом режиме; для гарантированной ошибки используйте ловушку set у Proxy.

function getObjectValues(source, keys) {
  const selected = Object.create(null);
  for (const key of keys) {
    if (!Object.hasOwn(source, key)) throw new Error(`Нет свойства ${key}`);
    selected[key] = source[key];
  }
  Object.freeze(selected);
  const deny = () => { throw new TypeError('readonly'); };
  return new Proxy(selected, {
    set: deny, defineProperty: deny, deleteProperty: deny, setPrototypeOf: deny
  });
}

Чтение остаётся обычным, а запись явно бросает TypeError независимо от strict mode. Возвращается поверхностный снимок: если значение — объект, его внутренние поля этим решением не замораживаются. Приватный target не отдаётся наружу.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее