Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите доработать код

Thomas Мыслитель (5506), на голосовании 1 год назад
Реализуйте и экспортируйте по умолчанию функцию, которая принимает объект и список полей объекта, к которым она будет ограничивать доступ. При попытке прочитать или перезаписать поле, включенное в список защищенных, должно выбрасываться исключение.
 import protect from '../protect.js'; 

const user = {
name: 'John',
age: 25,
password: 'secret',
};

const protectedProps = ['password'];

const protectedUser = protect(user, protectedProps);
protectedUser.name; // John
protectedUser.age; // 25
protectedUser.password; // Error: Access to 'password' is restricted

protectedUser.name = 'Jane'; // установит значение 'Jane' в свойство 'name'
protectedUser.password = 'newPassword'; // Error: Access to 'password' is restricted
В реализации используйте Proxy.

Мой код:
 const validateProperty = (target, prop) => { 
if (!(prop in target)) {
throw new Error(`There is no such ${prop} in the target`);
}
if (prop.startsWith('_')) {
throw new Error(`This ${prop} is protected`);
}
};

const protect = (obj) => new Proxy(obj, {
get: (target, prop) => {
const property = target[prop];
validateProperty(target, prop);
return (typeof property === 'function') ? property.bind(obj) : property;
},
set: (target, prop, value) => {
validateProperty(target, prop);
target[prop] = value;

return true;
},
});

export default protect;
Почему-то на последней стадии проверки выводит ошибку.
  ✓ Using Proxy (2 ms) 
✓ Check getters (1 ms)
✓ Check setters (1 ms)
✕ Check protected (2 ms)
Голосование за лучший ответ
Sergio 2.1 Оракул (67303) 1 год назад
 const protect = (obj, protectedProps) => new Proxy(obj, { 
get: (target, prop) => {
if (protectedProps.includes(prop)) {
throw new Error(`Access to '${prop}' is restricted`);
}
return target[prop];
},
set: (target, prop, value) => {
if (protectedProps.includes(prop)) {
throw new Error(`Access to '${prop}' is restricted`);
}
target[prop] = value;
return true;
},
});

export default protect;
ThomasМыслитель (5506) 1 год назад
Спасибо большое!
Похожие вопросы