Introduzione agli oggetti in Javascript

Gli oggetti rappresentano il tipo fondamentale nel linguaggio Javascript. Per questo motivo, in questa lezione ne introduciamo i concetti principali. A partire dalla prossima lezione vedremo, poi, come usarli.

Introduzione agli oggetti in Javascript

Javascript è un linguaggio orientato agli oggetti in quanto permette di usare il paradigma OOP, Object Oriented Programming. Per questo motivo fornisce gli strumenti per creare, modificare ed usare oggetti.

Altri linguaggi Object Oriented, come ad esempio C++, Java o C#, tuttavia, fondano il loro paradigma OOP sul concetto di "classe". Quando si studiano questi linguaggi bisogna partire da questo concetto per arrivare a poter usare gli oggetti. In Javascript questo non è necessario. In Javascript le classi sono state introdotte soltanto in revisioni successive del linguaggio in quanto originariamente non erano supportate. Inoltre è possibile creare oggetti senza definire classi di cui essi sono istanze, questo perché in Javascript gli oggetti sono tipi di dato veri e propri.

Gli oggetti sono valori compositi

In Javascript, un oggetto è un valore composito. Questo è un dettaglio fondamentale, in quanto:

  • un oggetto aggrega più valori, sia essi di tipo primitivo (come interi, booleani etc.) o altri oggetti.
  • un oggetto permette di memorizzare e richiamare tali valori attraverso un nome.

Detto questo, possiamo vedere un oggetto Javascript anche come una collezione non ordinata di proprietà, dove una proprietà è una coppia Nome, Valore. Tali proprietà sono note, in gergo tecnico, come membri dell'oggetto. I nomi delle proprietà sono tipicamente stringhe, per cui un oggetto è una mappa che associa delle stringhe a dei valori. Per i programmatori più esperti, questo sicuramente richiama alla mente delle strutture dati note con vari nomi: dizionari, Hashmap o Array associativi. Infatti, all'atto pratico in Javascript gli oggetti sono dei Dizionari.

Questa è la differenza cruciale che contraddistingue Javascript da altri linguaggi OOP. Poiché, in sostanza, gli oggetti sono dizionari, essi possono essere istanziati senza aver definito nessuna classe. Questo non è possibile in linguaggi come Java o C#.

Ovviamente, in Javascript gli oggetti sono molto più che dizionari in quanto permettono anche di definire funzioni, meglio note come metodi, che agiscono sulle proprietà degli oggetti stessi.

Gli oggetti sono dinamici

In Javascript gli oggetti sono dinamici, ossia è possibile aggiungere o rimuovere proprietà dinamicamente durante l'esecuzione del programma. Questa è un'altra fondamentale differenza rispetto ad altri linguaggi dove, invece, una volta definita la classe di un oggetto con tutte le sue proprietà, chiamate anche membri, non è possibile aggiungerne di nuove o rimuoverne di presenti dinamicamente.

Questa caratteristica deriva dal fatto che, in sostanza, gli oggetti Javascript sono dizionari e come tali permettono l'aggiunta e la rimozione di proprietà.

Gli oggetti sono mutabili

Tutto ciò che in Javascript non è una stringa, un numero, true, false, null o undefined è un oggetto e viene trattato come tale. Gli oggetti sono mutabili, nel senso che essi possono essere modificati. Si pensi, invece, alle stringhe che sono immutabili, cioè ogniqualvolta viene modificata una stringa, all'atto pratico ne viene creata una nuova, ossia viene allocato lo spazio in memoria per crearne una nuova.

Essendo mutabili, ne consegue che gli oggetti vengono manipolati per riferimento. Ad esempio, se x è un oggetto ed eseguiamo una riga di codice come la seguente:

let y = x;

la variabile y non conterrà una copia di x, bensì farà riferimento all'oggetto a cui fa riferimento x. Pertanto, applicando delle modifiche attraverso il riferimento y, esse saranno visibili anche attraverso il riferimento x.

I prototipi

Dal momento che in Javascript è possibile creare oggetti senza definire classi, esiste anche il modo di implementare l'ereditarietà tra oggetti senza l'ausilio delle classi. Una delle caratteristiche chiave di Javascript sono i prototipi.

Un oggetto è un aggregato di proprietà, cioè coppie chiavi valori. Oltre a possedere le proprie, un oggetto può anche ereditare le proprietà di un altro oggetto, in gergo tecnico prototipo. In questo modo Javascript permette di implementare una forma di ereditarietà senza classi ed originariamente era l'unico modo di farlo.

Infine, è possibile distinguere tra proprietà dell'oggetto e proprietà ereditate dal prototipo. Nel gergo di Javascript le prime prendono il nome di proprietà proprie (own properties).

Attributi delle proprietà

Una proprietà di un oggetto, oltre ad avere un nome ed un valore, può anche avere un attributo. In Javascript ne esistono tre:

  • writable: Questo attributo indica se la proprietà può essere modificata oppure se vi si può accedere in sola lettura.
  • enumerable: Questo attributo indica se la proprietà verrà scandita in un ciclo for/in. Nelle prossime lezioni vedremo cosa significa.
  • configurable: Questo attributo specifica se una proprietà può essere cancellata e se i suoi attributi possono essere alterati.

Nelle successive lezioni vedremo anche come impostare gli attributi delle proprietà di un oggetto.

Riassumendo

Questa lezione fornisce una panoramica sulle caratteristiche degli oggetti in Javascript e le differenze rispetto ad altri linguaggi di programmazione. In particolare abbiamo visto che:

  • Gli oggetti sono valori compositi ed assomigliano alle strutture dati note come dizionari o hashmap.
  • In quanto valori compositi, gli oggetti aggregano proprietà ossia coppie nome/valore
  • Gli oggetti sono dinamici, ossia le proprietà sono modificabili a runtime durante l'esecuzione del programma
  • Gli oggetti sono mutabili e vi si accede per riferimento
  • Un oggetto ha le sue own properties e può ereditare le proprietà di un altro oggetto che prende il nome di prototipo.
  • Le proprietà di un oggetto possono avere degli attributi.

Avendo in mente questi concetti, nella prossima lezione entreremo nel vivo vedendo come Javascript ci permette di creare gli oggetti.