Ricerca…
introduzione
Un proxy in JavaScript può essere utilizzato per modificare le operazioni fondamentali sugli oggetti. I proxy sono stati introdotti in ES6. Un Proxy su un oggetto è esso stesso un oggetto, che ha trappole . Le trap possono essere attivate quando vengono eseguite operazioni sul proxy. Ciò include la ricerca di proprietà, la funzione di chiamata, la modifica delle proprietà, l'aggiunta di proprietà, eccetera. Quando non viene definita alcuna trap applicabile, l'operazione viene eseguita sull'oggetto proxy come se non vi fosse alcun proxy.
Sintassi
let proxied = new Proxy(target, handler);
Parametri
Parametro | Dettagli |
---|---|
bersaglio | L'oggetto target, le azioni su questo oggetto (get, setting, ecc ...) verranno instradate attraverso il gestore |
gestore | Un oggetto che può definire "trappole" per intercettare azioni sull'oggetto di destinazione (ottenimento, impostazione, ecc ...) |
Osservazioni
Un elenco completo di "trap" disponibili può essere trovato su MDN - Proxy - "Metodi dell'oggetto gestore" .
Proxy molto semplice (usando il set trap)
Questo proxy aggiunge semplicemente la stringa " went through proxy"
a tutte le proprietà stringa impostate object
destinazione.
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
Proxyying ricerca di proprietà
Per influenzare la ricerca delle proprietà, è necessario utilizzare il gestore di get
.
In questo esempio, modifichiamo la ricerca della proprietà in modo che non venga restituito solo il valore, ma anche il tipo di tale valore. Usiamo Reflect per facilitare questo.
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"}`