Войти Регистрация
Фронтенд

72. Proxy прячет телефон продавца в объявлении Авито

Сложная

Что выведет код? Скрипт запускается как обычный файл Node (CommonJS, не строгий режим). Запишите строки по порядку, по одной на строку.

В работе: Телефон продавца на Авито показывают только по кнопке; объект объявления отдают виджетам через Proxy, чтобы номер случайно не попал в аналитику.

Как проверяем Код не запускаем — предскажите вывод. Пишите строки по порядку, по одной на строку; пробелы по краям не важны. Ответ один на подход: после него показываем разбор.
ProxyReflectловушкиJSON.stringifyстрогий режим

Источник: на задачах Авито: карточка объявления, скрытый телефон. Условие пересказано своими словами.

  1. const ad = { title: 'Велосипед Stels', price: 12000, _ownerPhone: '+79161234567' };
  2. const log = [];
  3. const safe = new Proxy(ad, {
  4. get(t, k, r) {
  5. if (typeof k === 'string') log.push('get ' + k);
  6. if (typeof k === 'string' && k.startsWith('_')) return undefined;
  7. return Reflect.get(t, k, r);
  8. },
  9. set(t, k, v) {
  10. log.push('set ' + k);
  11. if (k === 'price' && v < 0) return false;
  12. return Reflect.set(t, k, v);
  13. },
  14. has(t, k) { return !k.startsWith('_') && k in t; },
  15. ownKeys(t) { return Reflect.ownKeys(t).filter((k) => !k.startsWith('_')); },
  16. });
  17. console.log(safe._ownerPhone, '_ownerPhone' in safe, Object.keys(safe).join(','));
  18. safe.price = -5;
  19. console.log(ad.price);
  20. try { (function () { 'use strict'; safe.price = -5; })(); } catch (e) { console.log(e.constructor.name); }
  21. log.length = 0;
  22. console.log(JSON.stringify(safe));
  23. console.log(log.join(' | '));
  24. const copy = { ...safe };
  25. console.log(Object.keys(copy).length, ad === safe, safe.hasOwnProperty('_ownerPhone'));