Каталог
Веб-разработка с нуля: четыре курса по порядку.
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Каталог
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Урок 96 из 114 · 9 мин
Reflect.get, set, has, deleteProperty, ownKeys, defineProperty, getOwnPropertyDescriptor, getPrototypeOf, setPrototypeOf, isExtensible, preventExtensions, apply и construct.
Каждой ловушке Proxy соответствует функция Reflect с теми же аргументами. Внутри ловушки вызываешь Reflect — и операция идёт как обычно.
Reflect · get() · set()Reflect.get(obj, key, receiver) и Reflect.set(obj, key, value, receiver) — как obj[key], но функцией; set возвращает true или false вместо ошибки.const log = [];
const p = new Proxy({ latte: 220 }, {
get(t, k, r) { log.push(k); return Reflect.get(t, k, r); }
});
p.latte;
console.log(log, Reflect.set(Object.freeze({}), "x", 1));Reflect.has() · Reflect.deleteProperty() · Reflect.ownKeys()has — как in, deleteProperty — как delete (возвращает успех), ownKeys — все свои ключи, включая символы и неперечисляемые.const o = { a: 1, [Symbol("s")]: 2 };
console.log(Reflect.has(o, "a"), Reflect.ownKeys(o).length, Reflect.deleteProperty(o, "a"), o);Reflect.defineProperty() · Reflect.getOwnPropertyDescriptor()defineProperty возвращает true/false вместо исключения.const o = Object.freeze({});
console.log(Reflect.defineProperty(o, "x", { value: 1 }), Reflect.getOwnPropertyDescriptor({ a: 1 }, "a").writable);Reflect.getPrototypeOf() · Reflect.setPrototypeOf()setPrototypeOf возвращает успех.const proto = { hi() { return "привет"; } };
const o = {};
console.log(Reflect.setPrototypeOf(o, proto), Reflect.getPrototypeOf(o) === proto, o.hi());Reflect.isExtensible() · Reflect.preventExtensions()preventExtensions возвращает успех.const o = {};
console.log(Reflect.isExtensible(o), Reflect.preventExtensions(o), Reflect.isExtensible(o));Reflect.apply() · Reflect.construct()apply(fn, this, args) — вызвать функцию; construct(Class, args) — как new Class(...args).class Order { constructor(id) { this.id = id; } }
console.log(Reflect.apply(Math.max, null, [150, 290]), Reflect.construct(Order, [7]).id);В ловушке Proxy делай «как обычно» через Reflect с теми же аргументами — так не потеряется receiver.
Сделай logged(obj, log): Proxy, который в ловушке get добавляет имя ключа в массив log и возвращает значение через Reflect.get.
Reflect.get — пока нетВыберите один ответ.
Чем Reflect.set удобнее присваивания внутри ловушки?
Проверяем состояние обучения…