JS JavaScript  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Proxy, Reflect и метапрограммирование

Профессиональный тест о ловушках Proxy, Reflect API, языковых инвариантах и практических ограничениях метапрограммирования. Вопросы требуют предсказать receiver, поведение private fields, перечисление ключей и причины TypeError при нарушении правил целевого объекта.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов и 85 минут; код лучше читать построчно, не полагаясь на первое впечатление. После завершения откроются общий процент, 6 тематических шкал и объяснение каждого решения.
Вопрос 1 из 30
Какой trap вызывается выражением key in proxy?
JavaScript
const proxy = new Proxy(target, {
  has(target, key) { return Reflect.has(target, key); }
});
console.log("id" in proxy);
Вопрос 2 из 30
Какой результат даст get с запасным 0?
JavaScript
const p = new Proxy({}, {
  get(target, key, receiver) {
    return Reflect.has(target, key) ? Reflect.get(target, key, receiver) : 0;
  }
});
console.log(p.missing);
Вопрос 3 из 30
Что должен вернуть set trap при успешной записи?
JavaScript
"use strict";
const p = new Proxy({}, {
  set(target, key, value, receiver) {
    Reflect.set(target, key, value, receiver);
    return false;
  }
});
p.x = 1;
Вопрос 4 из 30
Как перехватить вызов proxy как функции?
JavaScript
const logged = new Proxy(sum, {
  apply(target, thisArg, args) {
    console.log(args);
    return Reflect.apply(target, thisArg, args);
  }
});
Вопрос 5 из 30
Какой trap отвечает за Object.keys и Reflect.ownKeys?
JavaScriptПерехват списка ключей
const proxy = new Proxy(target, {
  ownKeys(target) { return Reflect.ownKeys(target); }
});
Object.keys(proxy);
Вопрос 6 из 30
Почему в get trap лучше Reflect.get(target,key,receiver), а не target[key]?
JavaScript
const target = { get total() { return this.price * this.count; }, price: 2, count: 3 };
const p = new Proxy(target, { get: Reflect.get });
Вопрос 7 из 30
Что возвращает Reflect.defineProperty при невозможной операции?
JavaScript
const frozen = Object.freeze({ x: 1 });
console.log(Reflect.defineProperty(frozen, "x", { value: 2 }));
Вопрос 8 из 30
Чем Reflect.construct(Target,args,NewTarget) полезен?
JavaScript
const handler = {
  construct(target, args, newTarget) {
    return Reflect.construct(target, args, newTarget);
  }
};
Вопрос 9 из 30
Что вернёт Reflect.deleteProperty для non-configurable свойства?
JavaScriptУдаление защищённого свойства
const target = {};
Object.defineProperty(target, "id", { value: 7, configurable: false });
console.log(Reflect.deleteProperty(target, "id"));
Вопрос 10 из 30
Почему Reflect.apply безопаснее target.apply в универсальной обёртке?
Вопрос 11 из 30
Что произойдёт, если get trap солжёт о non-writable non-configurable data property?
JavaScript
const target = {};
Object.defineProperty(target, "x", { value: 1, writable: false, configurable: false });
const p = new Proxy(target, { get() { return 2; } });
console.log(p.x);
Вопрос 12 из 30
Можно ли ownKeys скрыть non-configurable ключ?
JavaScript
const target = {};
Object.defineProperty(target, "fixed", { configurable: false });
const p = new Proxy(target, { ownKeys() { return []; } });
Reflect.ownKeys(p);
Вопрос 13 из 30
Что нельзя сообщить isExtensible trap?
Вопрос 14 из 30
Может ли defineProperty trap вернуть true, не создавая новое свойство на non-extensible target?
Вопрос 15 из 30
Почему нельзя сделать non-configurable свойство configurable через getOwnPropertyDescriptor trap?
Вопрос 16 из 30
Почему метод с #private может упасть на proxy?
JavaScript
class Counter {
  #n = 1;
  value() { return this.#n; }
}
const p = new Proxy(new Counter(), {});
p.value();
Вопрос 17 из 30
Почему Map.prototype.get может сообщить incompatible receiver на proxy?
JavaScript
const map = new Map([["x", 1]]);
const p = new Proxy(map, {});
console.log(p.get("x"));
Вопрос 18 из 30
Равен ли proxy своему target через ===?
JavaScript
const target = {};
const p = new Proxy(target, {});
console.log(p === target);
Вопрос 19 из 30
Можно ли узнать target произвольного Proxy стандартным API?
Вопрос 20 из 30
Как JSON.stringify взаимодействует с Proxy?
Вопрос 21 из 30
Почему get trap вызывает бесконечную рекурсию?
JavaScript
const p = new Proxy({}, {
  get(target, key, receiver) {
    return receiver[key];
  }
});
p.x;
Вопрос 22 из 30
Что делает Proxy.revocable после revoke?
JavaScript
const { proxy, revoke } = Proxy.revocable({ x: 1 }, {});
revoke();
console.log(proxy.x);
Вопрос 23 из 30
Как проверить, что readonly proxy действительно закрывает запись?
JavaScriptПроверка запрета записи
expect(() => { readonly.user = "Ada"; }).toThrow();
expect(target.user).toBe("Lin");
Вопрос 24 из 30
Почему логирование всех get само создаёт шум и искажение?
Вопрос 25 из 30
Какой тест нужен для ownKeys trap кроме Reflect.ownKeys?
Вопрос 26 из 30
Почему Proxy в горячем доступе может замедлить код?
JavaScript
for (let i = 0; i < 10_000_000; i++) {
  sum += proxiedPoint.x;
}
Вопрос 27 из 30
Когда обычный метод setName лучше set trap?
Вопрос 28 из 30
Как избежать создания нового proxy для одного target много раз?
Вопрос 29 из 30
Почему глубокое ленивое проксирование требует кэша вложенных объектов?
Вопрос 30 из 30
Как ограничить риск метапрограммирования в проекте?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу