Gestire gli oggetti con Javascript

In questa parte finale della nostra guida a Javascript ritengo opportuno affrontare alcuni concetti avanzati, come ad esempio la gestione degli oggetti e, conseguentemente, accennare alla cosiddetta programmazione orientata agli oggetti.

Prima di poter parlare di OOP, ovviamente, รจ necessario introdurre il concetto di oggetto. In realtร , nel corso di questa guida, abbiamo giร  avuto modo di avere a che fare con oggetti nativi del linguaggio; in questa lezione vedremo come creare oggetti personalizzati.

Pubblicitร 

Definizione di oggetto

In via di estrema sintesi possiamo definire un oggetto come unโ€™entitร  che possiede determinate caratteristiche (che si estrinsecano sotto forma di dati che prendono il nome di proprietร ) ed รจ in grado di svolgere determinate azioni (che si estrinsecano in funzionalitร  che prendono il nome di metodi).

Creare un oggetto personalizzato in Javascript

In un certo senso possiamo paragonare gli oggetti agli Array, nel senso che i primi ricordano strutturalmente un array associativo essendo composti da una serie di coppie nome/valore. Vediamo un esempio:

var auto = { marca: "Audi", modello: "A4" }

Nel nostro esempio abbiamo creato una variabile oggetto di nome "auto" avente due distinte proprietร  (marca e modello).

La sintassi, che estende la definizione di una comune variabile, prevede lโ€™utilizzo delle parentesi graffe per circondare le diverse coppie di nome/valore tra loro separate da virgole. Lโ€™operatore di assegnazione che "collega" il nome al valore รจ il simbolo dei due punti (:).

Eโ€™ appena il caso di sottolineare che nulla vieta di scrivere il medesimo oggetto sfruttando ritorni a capo ed un po di "indentatura" per migliorarne la leggibilitร :

var auto = {
  marca: "Audi",
  modello: "A4"
}

Una sintassi alternativa, ma del tutto equivalente a quella appena vista, prevede il ricorso allโ€™oggetto Object in questo modo:

var auto = new Object({
  marca: "Audi",
  modello: "A4"  
});

Lettura e modifica delle proprietร  di un oggetto Javascript

Accedere alla proprietร  di un oggetto javascript รจ estremamente semplice. Per farlo sarร  necessario far ricorso a questa sintassi:

nome_oggetto.nome_proprieta

Oppure:

nome_oggetto[nome_proprieta]

Le due sintassi sopra esposte sono analoghe.

Tornando al nostro esempio pratico, supponiamo di voler stampare a video la marca del nostro oggetto "auto". Per farlo utilizzeremo:

document.write(auto.marca);

Oppure:

document.write(auto["marca"]);

Altrettanto semplice e la modifica del valore di una delle proprietร  dellโ€™oggetto. Per farlo sarร  sufficiente comportarsi come nel caso della assegnazione di un nuovo valore ad una comune variabile:

nome_oggetto.nome_proprieta = nuovo_valore

Oppure:

nome_oggetto[nome_proprieta] = nuovo_valore

Ad esempio:

auto.modello = "Q3";

Oppure:

auto["modello"] = "Q3";

Aggiunta di nuove proprietร  ad un oggetto Javascript

Le procedura per lโ€™aggiunta e lโ€™eliminazione di proprietร  da un oggetto sono altrettanto semplici ed intuitive.

Supponiamo di voler aggiungere una nuova proprietร  "cilindrata" al nostro oggetto "auto". Per farlo scriveremo, semplicemente:

auto.cilindrata = 1800;

In sostanza, la sintassi per aggiungere una nuova proprietร  ad un dato oggetto รจ la seguente:

nome_oggetto.nome_nuova_proprieta = valore

In alternativa possiamo utilizzare la sintassi con le parentesi quadre:

nome_oggetto[nome_nuova_proprieta] = valore

Utilizzando questa seconda sintassi potremo utilizzare anche dei nomi con degli spazi al loro interno, ad esempio:

auto["tipo di trazione"] = "integrale"

Verificare se un oggetto possiede una data proprietร 

Vediamo come verificare se un oggetto possiede o meno una specifica proprietร . Per farlo utilizzeremo lโ€™operatore "in"; esso accetta come argomenti due operandi:

  • a sinistra di "in" deve essere presente una stringa o qualsiasi altro elemento che a sua volta possa essere convertito in un stringa;
  • a destra dellโ€™operatore deve invece essere indicato lโ€™oggetto allโ€™interno del quale eseguire la ricerca della proprietร .

Questa la sintassi:

if ("nome_proprieta" in nome_oggetto) {
  // ...
}

Si analizzi un semplice esempio:

var auto = new Object({
  marca: "Audi",
  modello: "A4"  
});
var testMarca = "marca" in auto;
var testCilindrata = "cilindrata" in auto;

In questo caso, il primo controllo sullโ€™oggetto "auto" restituirร  TRUE, la proprietร  "marca" รจ infatti associata ad esso, il secondo restituirร  invece FALSE, in quanto la proprietร  "cilindrata" non รจ presente nellโ€™oggetto "auto".

Molto simile alloperatore "in" รจ il metodo hasOwnProperty().

Questโ€™ultimo, a differenza di "in", restituisce TRUE solo se la proprietร  appartiene direttamente allโ€™oggetto ("in" restituisce TRUE anche se la proprietร  non รจ diretta ma รจ comunque presente nella catena di prototipi dellโ€™oggetto).

La sintassi di hasOwnProperty() รจ la seguente:

if (nome_oggetto.hasOwnProperty("nome_proprieta")) {
  // ...
}

Tornando allโ€™esempio precedente avremmo potuto scrivere cosรฌ:

var auto = new Object({
  marca: "Audi",
  modello: "A4"  
});
var testMarca = auto.hasOwnProperty("marca");
var testCilindrata = auto.hasOwnProperty("cilindrata");

Nel caso specifico lโ€™esempio con "in" produrrร  lo stesso risultato di questโ€™ultimo.

Eliminazione di proprietร  di un oggetto

Lโ€™eliminazione di proprietร  avviene mediante lo statement delete secondo questa sintassi:

delete nome_oggetto.nome_proprieta

Tornando al nostro oggetto "auto" supponiamo di voler eliminare la proprietร  "modello":

delete auto.modello;

Dโ€™ora in avanti, cercando di accedere a questa proprietร , lโ€™interprete Javascript ci restituirร  un valore undefined.

Impostare una proprietร  come "undefined" o "null" non ne determinerร  lโ€™eliminazione completa, sarร  infatti eliminato il valore della proprietร  ma non la chiave; quanto detto รจ dimostrabile attraverso un semplice esempio:

var auto = new Object({
  marca: "Audi",
  modello: "A4",
  cilindrata: 1800  
});
auto.marca = null;
auto.modello = undefined;
delete auto.cilindrata;

for(var i in auto) {
  if (auto.hasOwnProperty(i)) {
    console.log(i, '' + auto[i]);
  }
}

Si verifichi nella console il risultato dello script: come potete vedere le proprietร  "marca" e "modello" sono ancora regolamente presenti nellโ€™oggetto "auto".

Nella prossima lezione della nostra guida vedremo le basi della programmazione ad oggetti con javascript.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).