Создайте объект выбранных полей и запретите запись. 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 не отдаётся наружу.