Guida per Principianti sugli Proxy in JavaScript

Ciao a tutti, futuri programmatori! Oggi ci imbarcheremo in un viaggio emozionante nel mondo degli Proxy in JavaScript. Non preoccupatevi se non ne avete mai sentito parlare prima - inizieremo dalle basi e poi affineremo la nostra conoscenza. Alla fine di questo tutorial, sarete ben versati nell'arte dell'uso degli Proxy come un professionista!

JavaScript - Proxies

Cos'è un Proxy in JavaScript?

Iniziamo con una semplice analogia. Immagina di essere una celebrità (perché non sognare in grande, vero?). Sei così famoso che hai bisogno di qualcuno che gestisca i tuoi appuntamenti, le tue lettere dei fan e altre attività quotidiane. Questa persona che agisce per tuo conto è chiamata proxy nel mondo reale.

In JavaScript, un Proxy funziona in modo simile. È un oggetto che avvolge un altro oggetto (chiamiamolo oggetto target) e può intercettare e ridefinire le operazioni fondamentali per quell'oggetto. Cool, vero?

Ecco un esempio di base per iniziare:

let target = {
name: "John Doe",
age: 30
};

let handler = {
get: function(target, property) {
console.log(`Getting the ${property} property`);
return target[property];
}
};

let proxy = new Proxy(target, handler);

console.log(proxy.name);

Se esegui questo codice, vedrai:

Getting the name property
John Doe

Analizziamo questo:

  1. Abbiamo un oggetto target con le proprietà name e age.
  2. Creiamo un oggetto handler con una get trap (ne parleremo di più presto).
  3. Creiamo un proxy utilizzando il costruttore Proxy, passando il nostro target e handler.
  4. Quando proviamo ad accedere a proxy.name, la nostra get trap viene attivata, registrando un messaggio prima di restituire il valore effettivo.

Handler degli Proxy in JavaScript

Ora che abbiamo fatto un bagno di gambe, immergiamoci un po' di più nei Proxy handlers. Un handler è un oggetto che definisce le trappole per il nostro Proxy. Le trappole sono metodi che forniscono la ricerca delle proprietà, l'assegnazione, l'enumerazione, la chiamata delle funzioni, ecc.

Ecco una tabella di alcune trappole comuni:

Trap Descrizione
get Intercepts property access
set Intercepts property assignment
has Intercepts the in operator
deleteProperty Intercepts the delete operator
apply Intercepts function calls
construct Intercepts new operator

Analizziamo un esempio più completo utilizzando più trappole:

let target = {
name: "Alice",
age: 25
};

let handler = {
get: function(target, property) {
console.log(`Accessing the ${property} property`);
return target[property];
},
set: function(target, property, value) {
console.log(`Setting the ${property} property to ${value}`);
target[property] = value;
return true;
},
has: function(target, property) {
console.log(`Checking if ${property} exists`);
return property in target;
}
};

let proxy = new Proxy(target, handler);

console.log(proxy.name);  // Triggers get trap
proxy.job = "Developer";  // Triggers set trap
console.log("age" in proxy);  // Triggers has trap

Eseguendo questo codice otterrai:

Accessing the name property
Alice
Setting the job property to Developer
Checking if age exists
true

Non è fantastico? Il nostro Proxy ora intercetta l'accesso alle proprietà, l'assegnazione e l'operatore in!

Usi dell'Object Proxy in JavaScript

Potresti chiederti, "Questo è carino e tutto, ma quando lo userò davvero?" Ottima domanda! Gli Proxy hanno diverse applicazioni pratiche:

  1. Validazione: Puoi usare gli Proxy per validare i dati prima che vengano impostati su un oggetto.
let user = {
name: "Bob",
age: 30
};

let validator = {
set: function(obj, prop, value) {
if (prop === "age") {
if (typeof value !== "number") {
throw new TypeError("Age must be a number");
}
if (value < 0 || value > 120) {
throw new RangeError("Age must be between 0 and 120");
}
}
obj[prop] = value;
return true;
}
};

let proxiedUser = new Proxy(user, validator);

proxiedUser.age = 25;  // This works
try {
proxiedUser.age = "thirty";  // This throws a TypeError
} catch (e) {
console.log(e.message);
}
try {
proxiedUser.age = 150;  // This throws a RangeError
} catch (e) {
console.log(e.message);
}
  1. Logging: Puoi usare gli Proxy per registrare l'accesso alle proprietà degli oggetti.
let target = {
name: "Charlie",
age: 35
};

let logger = {
get: function(target, property) {
console.log(`Property ${property} accessed at ${new Date()}`);
return target[property];
}
};

let proxiedTarget = new Proxy(target, logger);

console.log(proxiedTarget.name);
console.log(proxiedTarget.age);
  1. Valori Predefiniti: Puoi usare gli Proxy per fornire valori predefiniti per le proprietà non esistenti.
let handler = {
get: function(target, property) {
return property in target ? target[property] : "Property not found";
}
};

let proxy = new Proxy({}, handler);

proxy.name = "David";
console.log(proxy.name);  // Outputs: David
console.log(proxy.age);   // Outputs: Property not found

Elenco dei Handler Trap degli Proxy

Per concludere il nostro viaggio nel mondo degli Proxy in JavaScript, esaminiamo un elenco completo di tutte le trappole handler disponibili:

Handler Trap Descrizione
get Intercepts getting property values
set Intercepts setting property values
has Intercepts the in operator
deleteProperty Intercepts the delete operator
apply Intercepts function calls
construct Intercepts new operator
getPrototypeOf Intercepts Object.getPrototypeOf
setPrototypeOf Intercepts Object.setPrototypeOf
isExtensible Intercepts Object.isExtensible
preventExtensions Intercepts Object.preventExtensions
getOwnPropertyDescriptor Intercepts Object.getOwnPropertyDescriptor
defineProperty Intercepts Object.defineProperty
ownKeys Intercepts Object.getOwnPropertyNames and Object.getOwnPropertySymbols

Ecco fatto! Abbiamo coperto le basi degli Proxy in JavaScript, esplorato alcune applicazioni pratiche e persino visto tutte le trappole handler disponibili. Ricorda, come ogni strumento potente, gli Proxy dovrebbero essere usati con saggezza. Sono fantastici per alcuni casi d'uso, ma portano con sé un overhead prestazionale.

Spero che questo tutorial ti sia stato utile per demistificare gli Proxy in JavaScript. Continua a praticare, a programmare e prima di sapere, sarai un vero professionista degli Proxy! Buon coding!

Credits: Image by storyset