Homa Page di Daniele Franceschini
Introduzione agli oggetti javascript
Un tipo dato primitivo ha la possibilità di contenere un singolo valore ad esempio una stringa, un numero, ecc., invece un oggetto è un tipo dato composto ossia racchiude dentro se più informazioni. Queste informazioni posso essere lette o scritte semplicemente facendo riferimento ai loro rispettivi nomi. Gli oggetti in javascript possono essere creati in diversi modi:
1. Attraverso l'operatore new ad esempio:
var o = new Object();
L'esempio sovrastante è l'esempio più semplice per creare un oggetto che in questo caso è ovviamente vuoto.
Un'altro modo per creare un oggetto può essere questo:
var square = new Function("x", "return x*x;");
alert('Il quadrato di 2 è ' + square(2));
2. A partire dalla versione 1.2 di javascript è possibile creare oggetti anche inserendo la descrizione dell'oggetto attraverso il seguente formato:
var info = {
name: "Mario", surname: "Rossi"
};
alert(info.name);
alert(info.surname);
Questo letterale oggetto viene generato attraverso un elenco di dati separati da una virgola, questa specifica rappresenta le proprietà e i valori dell'oggetto. Ovviamente gli oggetti di questo tipo possono essere molto più complessi di quello presentato, ad esempio una proprietà di un oggetto potrebbe contenere anche altri oggetti e così via.
L'operatore "new" si occupa della creazione dell'oggetto e la prima cosa che fa è quella di chiamare il così detto costruttore dell'oggetto. Nel primo esempio, ossia: "var o = new Object()" il costruttore "Object()" è predefinito nel linguaggio stesso. Lo stesso vale per il secondo esempio: "var square = new Function("x", "return x*x;")", il costruttore Function è predefinito nel linguaggio. Il terzo caso è un po' particolare in quanto non si fa uso dell'operatore "new", tuttavia le parentesi graffe racchiudono le proprietà e i valori di un oggetto, il risultato della sintassi di questa istruzione composta prevede la formazione di un oggetto.
Per accedere alle proprietà di un oggetto si usa il ".", il valore di sinistra è un riferimento ad un oggetto, il valore di destra è il nome delle proprietà che si vuole utilizzare.
In javascript è anche possibile creare le proprietà di un oggetto con la semplice assegnazione di un valore, ad esempio:
var info = new Object();
info.name = "Mario";<br />info.surname = "Rossi"<br />info.delivery = new Object();<br />info.delivery.address = "via indirizzo 123"<br />info.delivery.zipcode = "12345"<br />info.delivery.state = "Italy"<br />info.residence = new Object();<br />info.residence = {address: "via vai 456", zipcode: "45678", state: "Italy"}</pre> <p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; text-align: justify; padding: 0px;">
Nell'esempio precedente si è creato un oggetto semplice con il costruttore "Object()" al quale abbiamo aggiunto alcune proprietà con la semplice assegnazione, la proprietà delivery contiene un altro oggetto che ha le proprietà address, zipcode, state. Infine anche la proprietà residence è un oggetto ma la sua inizializzazione è stata fatta con la sintassi del letterele oggetto.
Oggetti prototipo ed ereditarietà.
In javascript ogni oggetto ha un prototipo da cui eredita tutte le proprietà. L'oggetto prototipo viene associato al costruttore. Questo aspetto rende l'oggetto prototipo molto utile nei casi in cui le proprietà e i metodi sono costanti. Le proprietà non sono copiate nel nuovo oggetto ma sono un riferimento all'oggetto prototipo.
I vantaggi derivanti dall'utilizzo dell'oggetto prototipo:
1. Risparmio di memoria in quanto gli oggetti fanno riferimento alle proprietà e ai metodi dell'oggetto prototipo.
2. Se vengono aggiunte delle funzionalità all'oggetto prototipo, tutti gli oggetti che derivano da questo, godono immediatamente delle nuove funzionalità.
3. Possibilità di mascherare le funzionalità dell'oggetto prototipo, ossia: quando ci si riferisce a un metodo a una proprietà di un oggetto, javascript prima controlla che esiste nell'oggetto instanziato e se non la trova continua la ricerca nell'oggetto prototipo. Tutto questo è vero fino a quando si legge valori da una proprietà ma quando si scrive, javascript crea una nuova proprietà nell'oggetto derivato, al fine di non andare a corrompere altre elaborazione che usano il medesimo oggetto prototipo. Per cui l'ereditarietà vale solo in lettura.
Un esempio:info.prototype.getFullName = {this.name + ' ' + this.surname}
Anche gli oggetti predefiniti dal linguaggio hanno oggetti prototipo, ad esempio:String.prototype.capitalize = function(){
eturn this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1 + p2.toUpperCase(); } );
};
var myString = "mario rossi è bravissimo";<br />alert(myString.capitalize(myString));</pre> <p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; text-align: justify; padding: 0px;">
La funzione di capitalize non è mia, non sono così bravo con regexp.
Per concludere si può dire che javascript è un linguaggio orientato agli oggetti, certo, un po a modo suo. Infatti, normalmente quando si parla di programmazione a oggetti, di solito ci si riferisce sempre ad un concetto che fino a questo punto non è stato mai menzionato ossia: le classi.
Nella programmazione a oggetti le classi rappresentano un prototipo dell'oggetto ma che poco ha a che fare con l'oggetto prototype di javascript. La classe è un modello dell'oggetto che verrà realizzato al momento dell'istanza. Nella programmazione ad oggetti esisterebbero anche dei metodi detti di classe. Questo tipo di metodi si distingue dai metodi di istanza, che possono essere richiamata solo dopo che l'oggetto è stato creato, dal fatto che possono essere richiamata direttamente utilizzando la classe. Questa caratteristica permette di avere dei metodi globali che possono essere richiamati da qualsiasi fonte riesca a utilizzare la classe. Lo stesso vale per le proprietà di classe che possono essere viste a livello globale. Questo tipo di dati ha la stessa funzione delle variabili globali. Allora verrebbe da chiedersi: se hanno la stessa funzione che me ne faccio?
Domanda legittima. In effetti un vantaggio ci sarebbe che è insito in tutta la programmazione ad oggetti: ossia un magiore controllo e una diminuzione dei conflitti nel nomenclatura delle variabili. Un vantaggio nella programmazione ad oggetti ci deve essere pur essere altrimenti che l'hanno fatta a fare?
Faccio qualche esempio.
Il modo per simulare una proprietà detta di classe nella programmazione ad oggetti, anche se javascript le classi non le ha, è la seguente:function infoPersona(){
this.name;
this.surname;
}
var info = new infoPersona();
info.name = "Mario"; //inizializzo la proprietà dell'oggetto<br />info.surname = "Rossi"; //inizializzo la proprietà dell'oggetto<br />//inizializzo la proprietà del costruttore ossia: la così detta proprietà di classe<br />infoPersona.proprietaPubblica = "(valore globale)";<br />//leggo la proprietà "name" dell'oggetto
alert("valore istanza oggetto: " + info.name);
alert("valore funzione costruttote " + infoPersona.proprietaPubblica
+ " detto anche nella OP proprietà di classe"); //leggo la proprietà "di classe"
Uno dei vantaggi della programmazione ad oggetti sta proprio nel fatto di poter riservare un ambito specifico alle variabili senza rischiare di creare conflitti con variabili già dichiarate o di sovrascriverne il valore. Inoltre la possibilità di specializzare le varie parti del programma in oggetti, permette di organizzare meglio il lavoro.
I metodi di classe si creano alla stesso modo delle proprietà, ossia: si attribuisce una funzione a una proprietà di un costruttore.



