Вопрос пользователя Роман Галлямов в уроке «Прокси (Proxy)», курс «JS: Объектно-ориентированный дизайн»

Роман Галлямов

Добрый день! Кивните, пожалуйста, в каком направлении вообще думать) Я в некотором замешательстве на счет того, что вообще происходит. Самое первое что пришло в голову, это просто условная конструкция, проверяющая prop.startsWith('_'). Но тут же стало ясно, что класс Course устроен так, что такое условие сработает в любом случае. Ведь, например getName() всё равно в итоге обращается к _name. Я что-то совсем в ступоре, вроде только смог понять как пройти последний тест https://ru.hexlet.io/code_reviews/343552, а может просто повезло и даже это неверно.

5 0

Сергей Мелодин

Роман Галлямов, приветствую.

класс Course устроен так, что такое условие сработает в любом случае. Ведь, например getName() всё равно в итоге обращается к _name

При обращении к getName в прокси приходит имя метода, а не свойства. Так что всё отработает как надо. Добавьте проверку, которую планировали, сделайте на неё выброс исключения и всё должно получиться!

0

Роман Галлямов

Сергей Мелодин, Здравствуйте! Спасибо за отклик! Но ведь при такой проверке не проходит тест на публичные свойства. https://ru.hexlet.io/code_reviews/343552. Отладочная печать показывает, что после getName приходит language а затем _name, как я понимаю, это как раз содержание самой функции getName, т.е. return ${this.language}: ${this._name}; Тут и срабатывает ловушка, и в итоге тест Check getters не проходит.

0

Сергей Мелодин

Роман Галлямов, у вас не проходит тест на метод, судя по всему. Я обновил тесты, чтобы на первых шагах вывод был подробнее. Попробуйте сбросить упражнение, потом снова проверить своё решение.

0

Роман Галлямов

Сергей Мелодин, Большое спасибо, с таким выводом тестов, действительно, намного удобнее! И они сделали проблему очевиднее)

Теперь видно, что первые два теста "Check getters" проходят успешно, и заваливаются именно на третьем, всё на том же getName, и печать показывает последовательный вывод getName > language > _name. После чего уже начинается вывод из следующего теста: _created и т.д., который успешно проходит.

Ещё, не знаю важно ли это, но в предыдущей версии упражнения тест "Check setters" проходил успешно, и заваливался только тест "Check setters direct access". В новой версии упражнения "Check setters" не проходит, и jest указывает на условную конструкцию, которая находится в ловушке get.

Я полагал, что присваивание автоматически залетает в ловушку set. Такой вывод означает, что при попытке установить свойство оно сначала извлекается через геттер?

0

Сергей Мелодин

Роман Галлямов, вы усложняете работу прокси той логикой, которой там нет ) В перехватичик прокси просто прилетают имена, вы либо правильно из него определяете исходное свойство, либо неправильно. Запросы внутри перехватчиков уже никак не проксируются. В случае с обычными свойствами их достаточно просто вернуть или установить, а в случае с методами надо обратить внимание на подсказку про связывание.

0

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Похожие вопросы

Vyacheslav 17 ноября 2020 →

в задании не указано, что исключение надо выбрасывать также при обращении к несуществующему свойству

Voltaire Aurelio 13 ноября 2020 →

Ставь лайк, если метапрограммируешь джуном. Подписывайся, если в доках на прокси не указанно, что set, при ...

Dale Barbara 12 ноября 2020 →

Пните, будьте добры, в нужном направлении: с каким контекстом работать для разграничения нужных возвратов ?...