Поиск…
Вступление
Прокси-сервер в JavaScript может использоваться для изменения основных операций над объектами. Прокси были введены в ES6. Прокси-объект на объекте сам по себе является объектом, у которого есть ловушки . Ловушки могут срабатывать, когда операции выполняются на прокси. Это включает поиск свойств, вызов функции, изменение свойств, добавление свойств и т. Д. Когда подходящая ловушка не определена, операция выполняется на прокси-объекте, как если бы не было прокси.
Синтаксис
let proxied = new Proxy(target, handler);
параметры
параметр | подробности |
---|---|
цель | Целевой объект, действия над этим объектом (получение, настройка и т. Д.) Будут маршрутизироваться через обработчик |
обработчик | Объект, который может определять «ловушки» для перехвата действий на целевом объекте (получение, настройка и т. Д.) |
замечания
Полный список доступных «ловушек» можно найти на MDN-Proxy - «Методы объекта-обработчика» .
Очень простой прокси (с использованием ловушки набора)
Этот прокси просто добавляет строку " went through proxy"
в каждое свойство строки, заданное на целевом object
.
let object = {};
let handler = {
set(target, prop, value){ // Note that ES6 object syntax is used
if('string' === typeof value){
target[prop] = value + " went through proxy";
}
}
};
let proxied = new Proxy(object, handler);
proxied.example = "ExampleValue";
console.log(object);
// logs: { example: "ExampleValue went trough proxy" }
// you could also access the object via proxied.target
Поиск свойств Proxying
Чтобы влиять на поиск свойств, необходимо использовать обработчик get
.
В этом примере мы модифицируем поиск свойств так, чтобы возвращалось не только значение, но и тип этого значения. Мы используем Reflect для облегчения этого.
let handler = {
get(target, property) {
if (!Reflect.has(target, property)) {
return {
value: undefined,
type: 'undefined'
};
}
let value = Reflect.get(target, property);
return {
value: value,
type: typeof value
};
}
};
let proxied = new Proxy({foo: 'bar'}, handler);
console.log(proxied.foo); // logs `Object {value: "bar", type: "string"}`