Un oggetto è una collezione non ordinata di proprietà. Ciascuna proprietà è una coppia nome (key) - valore. I valori si memorizzano e si recuperano tramite il nome della proprietà, che funge da identificatore. Di fatto, un oggetto rappresenta una piccola “tabella di simboli” privata, accessibile in lettura e scrittura.
Il nome di una proprietà è sempre una stringa (anche quando lo si scrive come un identificatore non fra virgolette).
obj.nuovaChiave = valore;.delete, ad esempio delete obj.nuovaChiave;.Questa duttilità rende l’oggetto una struttura dinamica, in cui la “mappa” di proprietà può evolvere liberamente durante l’esecuzione.
Il valore associato a un nome può essere qualsiasi valore JavaScript: un primitivo (stringa, numero, booleano, null, undefined, symbol, bigint), un array, un altro oggetto o perfino una funzione.
Quando il valore è un oggetto o un array, l’oggetto “contiene” solo un riferimento: il dato reale risiede altrove nello heap. Questo permette la condivisione efficiente di strutture complesse ma richiede attenzione ai side-effect, perché due riferimenti possono puntare allo stesso sotto-oggetto. Se il valore è una funzione, parliamo di metodo: la funzione diventa parte integrante dell’oggetto e di solito opera sui suoi stessi dati tramite this.
JavaScript offre diversi approcci, concettualmente equivalenti, per ottenere un nuovo oggetto:
Literal con valori - La forma più concisa e consigliata:
const point = { x: 2, y: 5 };
const book = {
author: "Enrico",
title: "Learning JS",
for: "students",
pages: 520,
};
Literal vuoto - Parte da {} e aggiunge proprietà dopo: const p = {}; p.x = 2;.
Costruttore built-in - const p = new Object(); (verboso, senza vantaggi reali).
Object.create - Crea un oggetto specificando il prototipo: const p = Object.create({ x: 2, y: 5 });.
Funzione costruttrice/class - Utile quando si vogliono istanziare più oggetti che condividono lo stesso prototipo e la stessa logica di inizializzazione.
Scelta raccomandata: preferire la object literal syntax (punti 1 e 2). È più leggibile, evita sorprese e - in contesti moderni - è anche la più performante. Gli altri metodi hanno senso in casi mirati: prototipi personalizzati (
Object.create) o creazione di gerarchie di oggetti tramite funzioni costruttrici o classi.