Как правильно реализовать прокси в JS
Нужно при помощи прокси реализовать обращение к полям, чтобы в место p.open.name илиp.close.login было p.nameилиp.login
class Test{
constructor(){
this.open={name:'',surname:''}
this.close={login:'aaa'}
return new Proxy(this.open,{
get: function(target,prop){
if(prop=='name'||prop=='surname'){
return target[prop]
}
throw new Error('такого поля не существует')
},
set: function(target,prop){
if(prop=='name'||prop=='surname'){
return target[prop]
}
throw new Error('такого поля не существует(2)')
}
});
return new Proxy(this.close,{
get: function(target,prop){
if(prop=='login'){
throw new Error('у вас нет доступа к закрытому полю')
}
}
})
}
}
let p = new Test()
console.log(p.name)
console.log(p.surname)
console.log(p.login)
справился только с p.name(наверно))
Ответы (1 шт):
Автор решения: ThisMan
→ Ссылка
Во-первых вы в конструкторе возвращаете два раза значения ( два return не поддерживаются )
class Test{
constructor(){
this.open = { name: 'gaga', surname: '' }
this.close = { login: 'aaa' }
return new Proxy(this, {
get: function(target, prop) {
if(prop === 'name' || prop === 'surname'){
return target.open[prop];
}
if(prop === 'login') {
return target.close[prop];
}
return target[prop];
},
set: function(target, prop, val) {
if( prop === 'name' || prop === 'surname'){
target.open[prop] = val;
return true;
}
if(prop === 'login') {
target.close[prop] = val;
return true;
}
target[prop] = val;
return true;
}
});
}
}
let p = new Test();
console.log(p.login);
p.login = 'bbbb';
console.log(p.login);
console.log(p);
Во-вторых, "ловушка" set должна возвращать true, если запись прошла удачно ( и собственно сама записывать значение )