Il Modello a Oggetti di JavaScript Stefano Bistarelli Thanks to Roberto Bruni e Daniela Giorgetti Oggetti • Un oggetto possiede: – proprietà: i valori che ne descrivono la natura (anche altri oggetti) – metodi: le funzioni che può compiere • Uso della “dot notation” metodi proprietà Stefano Bistarelli oggetto 2 JS Object Library • Gli oggetti sono istanze di classi. • L’insieme di classi built-in (predefinite) di un linguaggio forma la class library. • Ma JS non sa “parlare” di classi (come invece riesce a Java, C++, etc.), almeno non ancora perché in JS2.0… • Per gli oggetti built-in di JS si parla dunque di object library. Stefano Bistarelli 3 Esempio: Date • classe: – Date • oggetto: – var dataodierna = new Date(); • il metodo costruttore della classe Date restituisce un oggetto di tipo Date che ha come stato la data corrente (ora inclusa) • metodi pubblici: – ore = dataodierna.getHours(); – minuti = dataodierna.getMinutes(); Stefano Bistarelli 4 Classi skip • Le classi danno la specifica astratta degli oggetti. – numero, nome e struttura delle proprietà e dei metodi – implementazione dei metodi • JS non offre dichiarazioni di classi… • … però consente la definizione di tipi oggetto Stefano Bistarelli 5 Esempio function Orologio(ore, minuti) { this.ore = ore; this.minuti = minuti; • Tipo oggetto: this.rimettiOra = rimettiOra; – Orologio • Proprietà: – ore – minuti • Metodi: this.dimmiOra = dimmiOra; }//notare assenza di “( )” per metodi function rimettiOra(ore, minuti) { this.ore=ore; this.minuti=minuti; } function dimmiOra() { – rimettiOra( ) – dimmiOra( ) var oomm=this.ore+“:”+this.minuti; document.write(“<p>Sono le ”+oomm); } Stefano Bistarelli 6 Il metodo new • Permette di creare nuovi oggetti… • … che sono… funzioni!!! • creare un tipo oggetto = definire una funzione con il nome del tipo oggetto • proprietà del tipo oggetto = parametri della funzione • (un solo costruttore per la classe) • implementazioni dei metodi = definizioni di funzioni con lo stesso nome e riferimenti alle stesse • “this” fondamentale: • indirizzo dell’oggetto corrente (quello creato con new) Stefano Bistarelli 7 Abbreviare con with • Il comando with permette di non ripetere tutte le volte il riferimento completo ad un certo oggetto • Sintassi: • with (oggetto) {comandi} • es. with (document) { write(“Il titolo di questa pagina è”); write(“<br />”+title+“<br />”): write(“e la URL è ”+URL); } Stefano Bistarelli 8 Metodi • modificatori • cambiano lo stato degli oggetti (ovvero modificano i valori di uno o più dati) • selettori • accedono i dati ma non li modificano • iteratori • accedono tutte le parti di un oggetto secondo un qualche ordine definito • costruttori • metodo di un tipo oggetto che crea una nuova istanza e la inizializza Stefano Bistarelli 9 Eventi • Contesto GUI (Graphical User Interface) • un evento è il risultato dell’azione di un utente, es. • • • • il click su un bottone la selezione di una stringa la chiusura di una finestra il caricamento di una pagina • gli eventi possono essere catturati e gestiti Stefano Bistarelli 10 Emulazione di eventi • Alcuni oggetti posseggono dei metodi in grado di simulare alcuni eventi • es. il tipo oggetto checkbox definisce un metodo click( ) che emula la selezione del checkbox • analogamente per Button • Attenzione: l’evento simulato non scatena la gestione automatica Stefano Bistarelli 11 Oggetti in JS • core objects • oggetti di base del linguaggio • consistenti attraverso tutte le implementazioni (Microsoft, Netscape, Sun, Mozilla, Opera,…) • client-side objects • grossolanamente, corrispondono ai tag • server-side objects • non li vediamo • user-defined objects • possiamo costruirci delle “librerie su misura” Stefano Bistarelli 12 Oggetti core-language Oggetti core-language • Standard per le varie piattaforme ma soggetti comunque all’evoluzione del linguaggio – – – – – – – – – Array (già discusso) Date (già discusso) String Math Global Number Boolean Function RegExp Stefano Bistarelli skip! 14 Oggetto Array • Aggiunto in JS1.1 • Costrutto fondamentale nei linguaggi di programmazione • permette di iterare su insiemi di oggetti • gli oggetti possono avere tipi diversi • non occorre dimensionare l’array • basta var pippo = new Array( ) • la proprietà length è read-only Stefano Bistarelli 15 Metodi valori.sort(); valori.reverse(); valori.join(separa); valori1.concat(valori2); valori.slice(i,j); // già visti valori.pop(); // estrae e restituisce l’ultimo elemento di valori (diminuisce anche la lunghezza dell’array) valori.push(n,m,…); // appende i dati n, m, … in fondo a valori e restituisce la nuova lunghezza dell’array valori.shift(); // estrae e restituisce il primo elemento di valori, spostando tutti gli altri di una posizione valori.unshift(n,m,…); // appende i dati n, m, … in cima a valori (spostando gli altri) e restituisce la nuova lunghezza dell’array Stefano Bistarelli 16 Pile e code 0 1 2 … push pop unshift push shift 0 1 2 … Stefano Bistarelli 17 Metodo splice valori.splice(i,k,v1,v2,…); // elimina e restituisce k elementi di valori a partire dall’i-esimo (incluso) che vengono eventualmente rimpiazzati da v1, v2, … v1 v2 … i i+1 … i+k-1 Stefano Bistarelli 18 Metodi “speciali” valori.toString(); // converte l’array valori in una stringa, se necessario convertendo ogni elemento con il rispettivo metodo .toString valori.toSource(); // restituisce il codice sorgente di valori Stefano Bistarelli 19 Prototype • Il metodo prototype permette di aggiungere nuove funzionalità agli oggetti (anche a quelli “core”) // si aggiunge il metodo Array.prototype.levaDispari = levaDispari; // si implementa il metodo function levaDispari() { if (this.length % 2 == 0) { i=this.length-1; } else { i=this.length-2; } while (i>0) { this.splice(i,1); i = i-2; } } Stefano Bistarelli 20 Oggetto Date • Favorisce la gestione delle date – convenzione UNIX: memorizzato in millisecondi a partire dal 1/1/1970 (da meno 108 a più 108 giorni) – la data attuale dipende dalla macchina client – non ha proprietà – grossolanamente ha tre tipi di metodi: • getXX: per ottenere informazioni • setXX: per modificare alcuni dati • toXX: per convertire in formati diversi Stefano Bistarelli 21 Creazione var data = new Date( parametri ) parametri: nulla => data corrente n (millisecondi dal 1/1/70) “month dd, yyyy hh:mm:ss” (es. “May 22, 2000”) yyyy, mm, dd, hh, mm, ss , ms (almeno due argomenti, es. 2002,7,12,7,10,29) Stefano Bistarelli 22 Alcuni metodi: get data.getMilliseconds(); // ritorna i millisecondi (da 0 a 999) data.getSeconds(); // ritorna i secondi (da 0 a 59) data.getMinutes(); // ritorna i minuti (da 0 a 59) data.getHours(); // ritorna l’ora (da 0 a 23) data.getDay(); // ritorna il giorno della settimana (da 0=domenica a 6) data.getDate(); // ritorna il giorno del mese (da 1 a 31) data.getMonth(); // ritorna il mese (da 0=gennaio a 11) data.getFullYear(); // ritorna l’anno (4 cifre) data.getUTC…(); // come sopra, riferito a GMT/UTC data.getTime(); // ritorna i millisecondi trascorsi dal 1-1-70 Stefano Bistarelli 23 Alcuni metodi: set data.setMilliseconds(x); // aggiorna i millisecondi data.setSeconds(x); // aggiorna i secondi data.setMinutes(x); // aggiorna i minuti data.setHours(x); // aggiorna l’ora data.setDay(x); // aggiorna il giorno della settimana data.setDate(x); // aggiorna il giorno del mese data.setMonth(x); // aggiorna il mese data.setFullYear(x); // aggiorna l’anno data.setUTC…(x); // come sopra, riferito a GMT/UTC data.setTime(x); // aggiorna i millisecondi trascorsi dal 1-1-70 Stefano Bistarelli 24 Alcuni metodi: to data.toLocaleString(); // converte l’oggetto data in formato stringa (usando il formato locale) data.toString(); // converte l’oggetto data in formato stringa data.toGMTString() // converte l’oggetto data in formato stringa (riferito al fuso orario GMT) data.toUTCString() // converte l’oggetto data in formato stringa (riferito all’ora universale UTC) data.valueOf() // ritorna i millisecondi trascorsi dal 1-1-70 (come .getTime()) Stefano Bistarelli 25 Il metodo statico parse Date.parse(x); // analizza la stringa x passata come argomento e la converte in un oggetto Date es. Date.parse(“Wed, 8 May 1996 17:41:46 –0400”) • è un metodo statico: può essere invocato solo su Date, NON su un qualsiasi oggetto di tipo Date! • il formato delle stringhe riconosciute dipende dall’implementazione del browser! • (l’esempio sopra è in un formato standard) Stefano Bistarelli 26 Quiz riassuntivi I – In JS, invece che di classi si parla di: • • • • Oggetti Prototipi Tipi oggetto Modelli – Gli oggetti possiedono: • • • • Proprietà e metodi Modificatori e distruttori Iteratori e selettori Sono nullatenenti Stefano Bistarelli 27 Quiz riassuntivi II – Gli oggetti JS si dividono in: • Due categorie • Tre categorie • Quattro categorie – Cosa fa il comando new Array([1,2],[3,4]) ? • Crea una matrice di dimensione 2x2 • Crea un vettore di lunghezza 4 • Crea un vettore di un solo elemento, la stringa “1,2,3,4” – Cosa fa il comando new Date(1992) ? • Crea una data inizializzando l’anno a 1992 • Crea la data corrispondente a 1992 msec trascorsi dal 1/1/1970 • Crea la data “1/9/92” Stefano Bistarelli 28 Esercizi Stefano Bistarelli 29 Oggetto String • Le stringhe sono fondamentali nei linguaggi di programmazione… e soprattutto per linguaggi di script • In JS le stringhe hanno un tipo oggetto con interessanti metodi built-in • Ma attenzione, prima di JS1.1 non potevano essere dichiarate con new • Una sola proprietà: length Stefano Bistarelli 30 Metodi HTML I • Molti metodi permettono di generare codice HTML per testo formattato testo.big(); // restituisce il testo racchiuso nei tag <BIG> e </BIG> testo.blink(); // come sopra per <BLINK> testo.bold(); // come sopra per <B> testo.fixed(); // come sopra per <TT> testo.italics(); // come sopra per <I> testo.small(); // come sopra per <SMALL> testo.strike(); //come sopra per <STRIKE> testo.sub(); //come sopra per <SUB> testo.sup(); //come sopra per <SUP> Stefano Bistarelli 31 Metodi HTML II: FONT • Formattare colore e dimensione con font testo.fontcolor(colore); // restituisce il testo racchiuso nei tag <FONT COLOR=“colore”> e </FONT> testo.fontsize(dimensione); //restituisce il testo racchiuso nei tag <FONT SIZE=“dimensione”> e </FONT> Stefano Bistarelli 32 Metodi HTML III: LINK • Gestire ancore e link testo.anchor(nome); // restituisce il testo racchiuso nei tag <A NAME=“nome”> e </A> testo.link(url); //restituisce il testo racchiuso nei tag <A HREF=“url”> e </A> Stefano Bistarelli 33 Metodi sottostringhe testo.charAt(i); // restituisce l’i-esimo carattere di testo (da 0 a testo.length-1) testo.slice(i,j); // restituisce la sottostringa di testo dalla posizione i a j-1 (inclusi) testo.substring(i,j); // come sopra (differenti se i<0 o j<i) testo.substr(i,k); // restituisce la sottostringa di testo lunga k caratteri che parte dalla posizione i Stefano Bistarelli 34 Metodi conversione testo.split(sep); // divide testo in un array di stringhe, spezzando in corrispondenza di ogni occorrenza della stringa sep testo.toLowerCase(); // restituisce la stringa testo con tutti i caratteri convertiti in minuscolo testo.toUpperCase(); // restituisce la stringa testo con tutti i caratteri convertiti in maiuscolo Stefano Bistarelli 35 Metodi ricerca testo.indexOf(parola,i); // restituisce la posizione della prima occorrenza della stringa parola nella stringa testo (a partire dalla posizione i). Se non esiste, restituisce –1 testo.lastIndexOf(parola,i); // come sopra, ma restituisce la posizione dell’ultima occorrenza Stefano Bistarelli 36 Metodi vari testo.concat(testo1,testo2,…); // restituisce la stringa ottenuta concatenando testo con testo1, testo2, … (equivale a testo+testo1+testo2+…) testo.charCodeAt(i); // restituisce il codice Unicode dell’i-esimo carattere di testo (da 0 a testo.length-1) Stefano Bistarelli 37 I metodi statici String.fromCharCode(val1,val2,…) // restituisce la stringa ottenuta concatenando i caratteri i cui codici Unicode sono val1, val2, … es. String.fromCharCode(126,66,114,117,110,105) // restituisce “~Bruni” • è un metodo statico: può essere invocato solo su String, NON su un qualsiasi oggetto di tipo String! • il metodo prototype permette di aggiungere nuove funzionalità Stefano Bistarelli 38 Caratteri speciali Simbolo \t \n \r \f \\ \b \” \’ Descrizione tabulazione interruzione di linea ritorno carrello avanzamento backslash backspace apici doppi apice singolo usare \r per andare a capo nei messaggi di alert Stefano Bistarelli 39 Oggetto Math • Per favorire calcoli matematici, JS incapsula costanti e funzioni (avanzate) utili nell’oggetto contenitore Math • Non si può usare come String e Array per crearne nuove istanze (oggetto statico) • Le costanti sono proprietà (tutte con nomi in maiuscolo) • Le funzioni sono metodi Stefano Bistarelli 40 Costanti matematiche Math.E // costante di Eulero e (base del logaritmo naturale) Math.LN10 // logaritmo naturale di 10 Math.LN2 // logaritmo naturale di 2 Math.LOG10E // logaritmo in base 10 di e Math.LOG2E // logaritmo in base 2 di e Math.PI // la costante pi-greco Math.SQRT1_2 // 1 diviso 2 Math.SQRT2 // 2 Stefano Bistarelli 41 Funzioni matematiche I Math.abs(x) // restituisce il valore assoluto di x Math.ceil(x) // restituisce l’intero immediatamente superiore a x Math.floor(x) // restituisce l’intero immediatamente inferiore a x Math.round(x) // arrotonda x all’intero più vicino Math.max(x,y) // restituisce il massimo tra x e y Math.min(x,y) // restituisce il minimo tra x e y Math.pow(x,y) // restituisce il xy (x alla potenza y) Math.sqrt(x) // restituisce x (radice quadrata di x) Stefano Bistarelli 42 Funzioni matematiche II Math.sin(x) // restituisce il seno di x Math.cos(x) // restituisce il coseno di x Math.tan(x) // restituisce la tangente di x Math.exp(x) // restituisce ex Math.log(x) // restituisce loge x Math.round(x) // arrotonda x all’intero più vicino Math.random() // restituisce un numero pseudo-casuale compreso tra 0 e 1 Stefano Bistarelli 43 Interi (pseudo)casuali • Spesso si vorrebbere generare un intero casuale compreso tra 1 e un certo valore: – possiamo sfruttare Math.random() – cerchiamo di definire una funzione riutilizzabile function casuale(numero) { var x = Math.random() * numero; x = Math.floor(x)+1; return x; } // restituisce un intero casuale tra 1 e numero Stefano Bistarelli 44 Arrotondamenti • Spesso si vorrebbe arrotondare ad alcune cifre decimali, invece che ad un intero (es. EURO) : – possiamo sfruttare Math.round() – cerchiamo di definire una funzione riutilizzabile function arrotonda(numero,decimali) { var potenza = Math.pow(10,decimali); var x = Math.round(numero * potenza)/potenza; return x; } // arrotonda numero a decimali cifre decimali Stefano Bistarelli 45 Quiz riassuntivi I – Quale dei seguenti oggetti NON può essere usato con la parola chiave new? • • • • Date Math String Array – Quante proprietà possiede l’oggetto Date? • Una • Nessuna • Centomila – Cosa restituisce Math.floor(Math.random())? • 0 • 1 • a volte 0, a volte 1 Stefano Bistarelli 46 Quiz riassuntivi II – Cosa restituisce “corso IFTS”.charAt(4)? • “o” • “s” •“ ” – Cosa restituisce “corso IFTS”.slice(4,5)? • “o ” • “so” • “o” – Cosa restituisce “corso IFTS”.substring(4,5)? • “o ” • “so” • “o” – Cosa restituisce “corso IFTS”.substr(4,5)? • “o IFT” • “so IF” • “o” Stefano Bistarelli 47 Esercizi Stefano Bistarelli 48 Oggetto Boolean • Aggiunto in JS1.1 • permette di convertire valori non-booleani in booleani • può essere usato come un booleano var boolvar = new Boolean( valore ) valore: false, 0, null, “”, omesso => false altrimenti => true metodo toString() e proprietà prototype Stefano Bistarelli 49 Oggetto Number • Supportato da JS1.1 • Incapsula valori numerici primitivi e cinque costanti particolari • Un solo metodo: toString() • Il metodo statico prototype può essere utile per aggiungere proprietà ai numeri (es. unità di misura) var numvar = new Number( valore ) restituisce NaN se la conversione fallisce Stefano Bistarelli 50 Costanti speciali Number.MAX_VALUE // il più grande numero rappresentabile Number.MIN_VALUE // il più piccolo numero rappresentabile Number.NaN //valore speciale (not_a_number) Number.POSITIVE_INFINITY // valore “infinito”, restituito da overflow Number.NEGATIVE_INFINITY // valore “infinito negativo”, restituito da overflow Stefano Bistarelli 51 Oggetto Global • Apparso nella versione ECMAScript 1.0 – Microsoft lo usò per raggruppare alcune proprietà e metodi di top-level – Netscape lo menzionò nella documentazione • Colleziona proprietà e oggetti “scomodi” da collocare altrove (senza parenti) • Quasi tutti sono fondamentali! Stefano Bistarelli 52 Global dà i numeri isFinite(valore) // determina se valore è “finito” (restituisce un booleano) isNaN(valore) // determina se valore è NaN (restituisce un booleano) parseInt(testo, radice) // analizza la stringa testo come se contenesse un numero in base radice (radice deve essere compreso tra 2 e 36; se omesso il default è 10); restituisce il valore numerico oppure NaN parseFloat(testo) // converte la stringa testo in valore a virgola mobile (oppure NaN se non ci riesce) Stefano Bistarelli 53 Global “riflette” eval(codice) // esegue la stringa codice come se fosse un’espressione o un comando javascript • Funzionalità molto potente (es. per scrivere interpreti javascript ricorsivi) scarsamente utilizzata in pratica • BUG: causa un blocco di sistema su NN2 e sotto Windows 3.1 • Esempi Stefano Bistarelli 54 Oggetto Function • Aggiunto con JS1.1 • permette di definire una stringa a run-time e compilarla come funzione! funcvar = new Function (arg1,…,argn, funcbody) • gli oggetti Function sono meno efficienti (ricompilati ogni volta che si eseguono) • funcvar è proprio una variabile Stefano Bistarelli 55 Quiz riassuntivi I – Quale dei seguenti oggetti NON può essere usato con la parola chiave new? • • • • Global Number Boolean Function – Che valore restituisce new Boolean()? • true • false • NaN – Cosa restituisce isNaN(parseInt(“O”))? •0 • NaN • true • false • non si capisce… si sta convertendo la lettera O o la cifra 0? Stefano Bistarelli 56 Esercizi Stefano Bistarelli 57