Oggetti in JavaScript

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.

Nomi e gestione delle proprietà

Il nome di una proprietà è sempre una stringa (anche quando lo si scrive come un identificatore non fra virgolette).

Questa duttilità rende l’oggetto una struttura dinamica, in cui la “mappa” di proprietà può evolvere liberamente durante l’esecuzione.

Valori delle proprietà

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.

Metodi equivalenti di creazione

JavaScript offre diversi approcci, concettualmente equivalenti, per ottenere un nuovo oggetto:

  1. 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,
    };
    
  2. Literal vuoto - Parte da {} e aggiunge proprietà dopo: const p = {}; p.x = 2;.

  3. Costruttore built-in - const p = new Object(); (verboso, senza vantaggi reali).

  4. Object.create - Crea un oggetto specificando il prototipo: const p = Object.create({ x: 2, y: 5 });.

  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.

Dichiarare funzioni in JavaScript: quadro generale