JavaScript/Oggetti

Wikibooks, manuali e libri di testo liberi.

Il concetto di oggetto è molto importante nella programmazione in JavaScript. In questo modulo verranno spiegate le caratteristiche comuni degli oggetti; nei moduli seguenti verranno invece trattati nel dettaglio gli oggetti intrinsechi di JavaScript.

L'uso degli oggetti e delle loro funzionalità entra a far parte del paradigma della programmazione orientata agli oggetti (abbreviata OOP, Object Oriented Programming)

Cosa sono gli oggetti[modifica]

Per avvicinarci al concetto di oggetto in informatica, possiamo pensare al concetto di oggetto nel mondo reale.
Per creare un nuovo oggetto è necessario partire da un modello (in JavaScript un oggetto chiamato prototipo) che indichi come creare altri oggetti dello stesso tipo (ogni oggetto è un'istanza del prototipo).

Gli oggetti possono inoltre possedere delle caratteristiche (proprietà): nel caso ad esempio di macchina (per fare un paragone con la realtà), saranno la cilindrata, le dimensioni, il costo, ecc....

Ciascuna istanza espone inoltre la possibilità di effettuare delle operazione su di essi (metodi): per la nostra macchina, metterla in moto o guidare. Queste operazioni modificheranno delle caratteristiche come il livello del suo carburante o la velocità.

Una volta introdotto il concetto di oggetto, dobbiamo avere però la capacità di astrarre: gli oggetti dell'informatica non corrispondono a quelli della realtà; hanno però numerosi vantaggi, tra i quali la possibilità di trattare dati più complessi di numeri e stringhe.

Gli oggetti in JavaScript[modifica]

JavaScript permette di creare i propri oggetti personalizzati; tuttavia per imparare è meglio iniziare a lavorare sugli oggetti predefiniti del linguaggio.

Per creare una nuova istanza di un oggetto è necessario utilizzare una funzione chiamata costruttore. Di fatto, in realtà, per definire un oggetto prototipo è quindi sufficiente creare un nuovo costruttore.

La sintassi quindi:

var variabile = new nome_oggetto ();

In questo modo la variabile variabile sarà l'unico modo per fare riferimento all'istanza di nome_oggetto appena creata.

I costruttori solitamente prevedono anche una serie di parametri per impostare automaticamente alcune proprietà dell'oggetto creato:

var variabile  = new nome_oggetto (parametri_del_costrutture);

Supponiamo di avere a che fare con un oggetto macchina implementato in JavaScript. Per inizializzare la variabile "la_mia_macchina" dobbiamo dunque richiamare la funzione costruttore del prototipo macchina, che per esempio potrebbe prevedere un parametro "modello" e "colore vernice":

var la_mia_macchina = new macchina ("Fiat Bravo", "Rosso");

Proprietà[modifica]

Possiamo pensare ad una proprietà come ad una variabile associata al singolo oggetto; il suo valore viene attribuito inizialmente dal costruttore e successivamente viene modificato agendo sull'oggetto (operando sui metodi, ecc...). Per fare riferimento alla proprietà (per il recupero o per l'assegnazione) si usa la sintassi:

nome_oggetto.nome_proprietà

Alcune proprietà possono essere di sola lettura, cioè il loro valore può essere letto ma non modificato: esse sono infatti legate a caratteristiche intrinseche dell'oggetto, oppure sono determinate dal prototipo in base a dati forniti in precedenza.

Se ad esempio riverniciamo la nostra macchina, ne cambiamo la proprietà "colore_vernice":

la_mia_macchina.colore_vernice = "Giallo"

Inoltre, supponiamo che il prototipo preveda la ricerca automatica della lunghezza della macchina in base al modello e che tale valore sia stato memorizzato nella proprietà di sola lettura "lunghezza" (infatti non è possibile intervenire sulla lunghezza della macchina, una volta scelto il modello):

<source lang=javascript>
alert('La mia macchina è lunga ' + la_mia_macchina.lunghezza + ' m!');

Metodi[modifica]

Un metodo è una funzione associata al singolo oggetto e definito nel costruttore; se nel prototipo è prevista una funzione metodo_esempio sarà possibile eseguire la funzione tramite la sintassi:

nome_oggetto.metodo_esempio () //ricordarsi le parentesi anche se non passiamo parametri!

Dal momento che le funzioni possono prevedere un valore di ritorno, sarà possibile inserire la notazione vista precedentemente all'intero di un'espressione.

Ad esempio, con la nostra macchina:

la_mia_macchina.rifornisci (20) //20 euro di benzina

NOTA: l'esempio riportato non ha nulla a che vedere con le intenzioni espresse, poichè aggiunge semplicemente un parametro di ingresso al metodo, senza alcun "valore di ritorno" previsto e/o salvato. Correggere.

La struttura with[modifica]

Quando si lavora con gli oggetti, può risultare comodo il costrutto with, che permette di accedere più volte ad un oggetto senza dover ogni volta specificare il suo nome. Ad esempio:

with (la_mia_macchina) {
 rifornisci (20) //20 euro di benzina
 alert(lunghezza); 
 altra_macchina.rifornisci(50); //per riferirmi ad altri oggetti devo indicare il loro nome
} //qui si conclude il blocco with

Creare oggetti personalizzati[modifica]

Per creare oggetti personalizzati, consultare il modulo Costruttori e prototipi.