Показать сообщение отдельно
  #1 (permalink)  
Старый 13.07.2020, 15:10
Интересующийся
Отправить личное сообщение для Launder Посмотреть профиль Найти все сообщения от Launder
 
Регистрация: 25.04.2019
Сообщений: 19

Ограничения getter (setter)
Решил запаролить доступ к объекту (как пример "оболочки" на объект), без использования прокси.
Попробовал такой нехитрый способ:
let obj =
     {
         a: 145,
         b: 146,
         c: 147
     }

let pass = 'lex';

let passObj =
               {
                  get p()
                         {
                            return prompt('password?') == pass ? obj : alert('access denied');
                         }
               }
     

obj = passObj.p; //перезаписываем ссылку на объект

alert( obj.a );
alert( obj.b );
alert( obj.c );


Радостно обнаружил, что пароль работает только один раз при присвоении, затем видимо, результат записывается в passObj.p, а затем обратно в obj. Немного согрелись
При этом если мы в геттере для passObj.p будем возвращать примитив, например число, то к нему будет нормальный доступ по паролю.
Читаю MDN:
1. нуль параметров (понятно)
2. Геттер не должен появляться в объектном литерале вместе с другим get (ок) или через ввод данных для того же свойства (а почему же тогда запрос пароля, для примитива работает?)
3. Он может иметь идентификатор, который является либо числом, либо строкой; - вот тут непонятно, имеется в виду, что результатом работы геттера может быть либо число, либо строка?...
В спецификации (искал "getter") я немного запутался, соотнести указанные там шаги с какими-то реальными операциями у меня не получилось...
Например, как расшифровать запись:
Код:
2. Let desc be ? O.[[GetOwnProperty]](P).
и где может быть общая информация, как выше в MDN, к сожалению, не совсем понятно...
В общем, хотелось бы понять, может ли геттер возвращать объект.
Понять получше, что он вообще может...
Ну и как бонус, попробовать найти альтернативу прокси в замыкании...
Ответить с цитированием