Как правильно реализовать прокси в 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, если запись прошла удачно ( и собственно сама записывать значение )

→ Ссылка