Proxy и Reflect
Перехват и переопределение операций над объектами.
Зачем нужно
Proxy оборачивает объект и перехватывает операции (чтение, запись, удаление). Reflect — набор стандартных реализаций этих операций. Основа реактивности во Vue 3.
Где используется
- Реактивные системы (Vue 3 reactivity)
- Валидация данных при записи
- Логирование доступа к свойствам
Code
// Базовый Proxy
const user = { name: 'Anton', age: 25 };
const proxy = new Proxy(user, {
get(target, prop) {
console.log(`Reading ${prop}`);
return Reflect.get(target, prop);
},
set(target, prop, value) {
if (prop === 'age' && typeof value !== 'number') {
throw new TypeError('Age must be a number');
}
return Reflect.set(target, prop, value);
},
deleteProperty(target, prop) {
console.log(`Deleting ${prop}`);
return Reflect.deleteProperty(target, prop);
}
});
proxy.name; // логирует "Reading name"
proxy.age = 30; // OK
proxy.age = 'old'; // TypeError
// has trap
const range = new Proxy({}, {
has(target, prop) {
const n = Number(prop);
return n >= 1 && n <= 100;
}
});
50 in range; // true
// Reflect — вызов стандартного поведения
Reflect.get(obj, 'prop');
Reflect.set(obj, 'prop', value);
Reflect.has(obj, 'prop');
Связанные темы
Ресурсы
🎓 Источник: Proxy и Symbol в JavaScript
- 📅 2018-11-26 · YouTube
- Тезисы: Proxy — это metaprogramming layer. Ловушки (traps) перехватывают internal methods: get/set/has/deleteProperty/ownKeys/construct/apply. Symbol — уникальные ключи для системных протоколов
⚡ Источник: ⎡coding 08⎦ JavaScript Live Coding Proxy - Или мы настоящие костоломы · AsForJS
- 📅 2023-10-15 · YouTube
- Тезисы:
- Proxy и Reflect — это два аспекта одной системы. Reflect — функциональное API над internal methods
- В trap всегда передавайте операцию через Reflect — это сохранит правильный receiver и invariant'ы
new Proxy(target, {})с пустым handler — прозрачный прокси, но даже он ломает оптимизации V8
⚡ Источник: ⎡coding 09⎦ JavaScript Live Coding Proxy - Или костоломы возвращаются · AsForJS
- 📅 2023-10-16 · YouTube
- Тезисы: invariants Proxy — что нельзя нарушить (если target sealed, прокси не может выдавать другие ключи). Список инвариантов в спеке для каждого trap