JavaScript прокси обект ви позволява да прихванете и персонализирате поведението на друг обект, без да променяте оригинала.
С помощта на прокси обекти можете да валидирате данни, да предоставяте допълнителна функционалност и да контролирате достъпа до свойства и функции.
Научете всичко за употребата на прокси обекти и как можете да ги създадете в JavaScript.
Създаване на прокси обект
В JavaScript можете да създавате прокси обекти, като използвате Проксиконструктор. Този конструктор приема два аргумента: a мишена обект за обвиване на проксито и a манипулатор обект, чиито свойства определят поведението на проксито, когато извършвате операции.
Той взема тези аргументи и създава обект, който можете да използвате вместо целевия обект. Този създаден обект може да предефинира основни операции като получаване, настройка и дефиниране на свойства. Можете също така да използвате тези прокси обекти, за да регистрирате достъп до собственост и да валидирате, форматирате или дезинфекцирате входове.
Например:
конст оригинален обект = {
Фу: "бар"
}конст манипулатор = {
получи: функция(цел, собственост){
връщане цел [свойство];
},
комплект: функция(цел, свойство, стойност){
цел [свойство] = стойност;
}
};
конст прокси = новПрокси(оригинален обект, манипулатор)
Този код създава целеви обект, оригинален обект, с едно свойство, Фуи обект манипулатор, манипулатор. Обектът манипулатор съдържа две свойства, получавам и комплект. Тези свойства са известни като капани.
Прихващането на прокси обект е функция, която се извиква всеки път, когато извършите определено действие върху прокси обект. Капаните ви позволяват да прихващате и персонализирате поведението на прокси обекта. Достъпът до свойство от прокси обекта извиква получавам trap и модифицирането или манипулирането на свойство от прокси обекта извиква комплект капан.
Накрая кодът създава прокси обект с Прокси конструктор. Отминава оригинален обект и манипулатор съответно като целеви обект и манипулатор.
Използване на прокси обекти
Прокси обектите имат няколко приложения в JavaScript, някои от които са както следва.
Добавяне на функционалност към обект
Можете да използвате прокси обект, за да обвиете съществуващ обект и да добавите нова функционалност, като регистриране или обработка на грешки, без да променяте оригиналния обект.
За да добавите нова функционалност, ще трябва да използвате Прокси конструктор и дефинирайте един или повече капани за действията, които искате да прихванете.
Например:
конст потребителски обект = {
първо име: "Кенеди",
фамилия: "Мартинс",
възраст: 20,
};конст манипулатор = {
получи: функция(цел, собственост){
конзола.log(„Получаване на собственост“${имот}"`);
връщане цел [свойство];
},
комплект: функция(цел, свойство, стойност){
конзола.log(`Свойство за настройка "${имот}"да оценявам"${value}"`);
цел [свойство] = стойност;
},
};конст прокси = новПрокси(потребителски обект, манипулатор);
конзола.log (proxy.firstName); // Получаване на свойството "firstName" Kennedy
конзола.log (proxy.lastName); // Получаване на свойство "lastName" Martins
proxy.age = 23; // Задаване на свойство "възраст" да оценявам "23"
Този кодов блок добавя функционалност чрез прокси прихващанията, получавам и комплект. Сега, когато се опитате да получите достъп или да промените свойство на userObject, прокси обектът първо ще регистрира вашата операция в конзолата, преди да осъществи достъп или да промени свойството.
Валидиране на данните, преди да бъдат зададени върху обект
Можете да използвате прокси обекти, за да потвърдите данните и да се уверите, че отговарят на определени критерии, преди да ги зададете на обект. Можете да направите това, като дефинирате логиката за валидиране в a комплект капан в манипулатор обект.
Например:
конст потребителски обект = {
първо име: "Кенеди",
фамилия: "Мартинс",
възраст: 20,
};конст манипулатор = {
получи: функция(цел, собственост){
конзола.log(„Получаване на собственост“${имот}"`);
връщане цел [свойство];
},
комплект: функция(цел, свойство, стойност){
ако (
Имот "възраст" &&
тип стойност == "номер" &&
стойност > 0 &&
стойност < 120
) {
конзола.log(`Свойство за настройка "${имот}"да оценявам"${value}"`);
цел [свойство] = стойност;
} друго {
хвърлямновГрешка(„Невалиден параметър. Моля, прегледайте и коригирайте.");
}
},
};
конст прокси = новПрокси(потребителски обект, манипулатор);
proxy.age = 21;
Този кодов блок добавя правила за валидиране към комплект капан. Можете да присвоите произволна стойност на възраст имот на а userObject инстанция. Но с добавените правила за валидиране можете да присвоите нова стойност на свойството възраст само ако е число, по-голямо от 0 и по-малко от 120. Всяка стойност, която се опитате да зададете на възраст свойство, което не отговаря на изискваните критерии, ще задейства грешка и ще отпечата съобщение за грешка.
Контролиране на достъпа до свойствата на обекта
Можете да използвате прокси обекти, за да скриете определени свойства на обект. Направете го, като дефинирате логиката на ограничаване в получавам капани за свойствата, до които искате да контролирате достъпа.
Например:
конст потребителски обект = {
първо име: "Кенеди",
фамилия: "Мартинс",
възраст: 20,
тел.: 1234567890,
електронна поща: "[email protected]",
};конст манипулатор = {
получи: функция(цел, собственост){
ако (Имот "телефон" || Имот "електронна поща") {
хвърлямновГрешка(„Отказан достъп до информация“);
} друго {
конзола.log(„Получаване на собственост“${имот}"`);
връщане цел [свойство];
}
},
комплект: функция(цел, свойство, стойност){
конзола.log(`Свойство за настройка "${имот}"да оценявам"${value}"`);
цел [свойство] = стойност;
},
};конст прокси = новПрокси(потребителски обект, манипулатор);
конзола.log (proxy.firstName); // Получаване на свойството "firstName" Kennedy
конзола.log (прокси.имейл); // Извежда грешка
Кодовият блок по-горе добавя определени ограничения към получавам капан. Първоначално можете да получите достъп до всички налични свойства на userObject. Добавените правила предотвратяват достъпа до чувствителна информация като имейл или телефон на потребителя. Опитът за достъп до някое от тези свойства ще предизвика грешка.
Други прокси капани
The получавам и комплект прихващанията са най-често срещаните и полезни, но има 11 други прокси прихващания на JavaScript. Те са:
- Приложи: The Приложи trap се изпълнява, когато извикате функция на прокси обекта.
- конструирам: The конструирам trap се изпълнява, когато използвате оператора new, за да създадете обект от прокси обекта.
- deleteProperty: The deleteProperty trap работи, когато използвате Изтрий оператор за премахване на свойство от прокси обекта.
- има - The има trap работи, когато използвате в оператор, за да провери дали съществува свойство на прокси обекта.
- ownKeys - The ownKeys trap се изпълнява, когато извикате или the Object.getOwnPropertyNames или Object.getOwnPropertySymbols функция на прокси обекта.
- getOwnPropertyDescriptor - The getOwnPropertyDescriptor trap работи, когато извикате Object.getOwnPropertyDescriptor функция на прокси обекта.
- defineProperty - The defineProperty trap работи, когато извикате Object.defineProperty функция на прокси обекта.
- предотврати Разширения - The предотврати Разширения trap работи, когато извикате Object.preventExtensions функция на прокси обекта.
- е Разширяем - The е Разширяем trap работи, когато извикате Object.isExtensible функция на прокси обекта.
- getPrototypeOf - The getPrototypeOf trap работи, когато извикате Object.getPrototypeOf функция на прокси обекта.
- setPrototypeOf - The setPrototypeOf trap работи, когато извикате Object.setPrototypeOf функция на прокси обекта.
Подобно на комплект и получавам traps, можете да използвате тези traps, за да добавите нови слоеве на функционалност, валидиране и контрол към вашия обект, без да променяте оригинала.
Минусите на прокси обектите
Прокси обектите могат да бъдат мощен инструмент за добавяне на персонализирана функционалност или валидиране към обект. Но те също имат някои потенциални недостатъци. Един такъв недостатък е трудното отстраняване на грешки, тъй като може да е трудно да се види какво се случва зад кулисите.
Прокси обектите също могат да бъдат трудни за използване, особено ако не сте запознати с тях. Трябва внимателно да обмислите тези недостатъци, преди да използвате прокси обекти във вашия код.