Реактивность через Proxy
Условие
createReactive(target, onChange): возвращает прокси, вызывающий onChange(путь, значение) при любой записи, включая вложенные объекты и удаление.
Что проверяют тесты
верхний уровень
вложенный путь
то же значение не будит
удаление
массив тоже отслеживается
чтение не портит данные
Как подойти
Так устроена реактивность Vue 3 и MobX. Ленивое оборачивание в get важно: прокси создаётся только для тех веток, к которым реально обращаются, а не для всего дерева сразу. Сравнение перед уведомлением - часть контракта, без него присвоение того же значения запускает каскад. Ограничения, которые стоит назвать: прокси не ловит операции над Map/Set без отдельных ловушек, и каждое чтение вложенного объекта создаёт новый прокси - для сравнения по ссылке нужен кеш.
Подсказки: 3
- Ловушка get возвращает новый прокси для объектных значений - так путь наращивается лениво.
- Сравнивай прежнее значение с новым, иначе запись того же значения поднимет лишний рендер.
- Удаление - отдельная ловушка deleteProperty.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.