67
OO JAVASCRIPT Sviluppo applicazioni web e linguaggio HTML LEZIONE 03

JavaScript Object Oriented

Embed Size (px)

DESCRIPTION

Continuando a parlare di JavaScript ...

Citation preview

Page 1: JavaScript Object Oriented

OO JAVASCRIPT

Sviluppo applicazioni web e linguaggio HTML

LEZIONE 03

Page 2: JavaScript Object Oriented

JavaScript? E’ un linguaggio di

scripting Object-Oriented

interpretato da un

browser web

Page 3: JavaScript Object Oriented

Tutto in JavaScript è un

oggetto, ovvero una

rappresentazione

di un concetto o di

una entità del

mondo reale

sotto forma di

dati + azioni

Page 4: JavaScript Object Oriented

var comodino = new Object();

comodino.cassetti = 3;

comodino.colore = ‘Bianco’;

comodino.altezza = 400; // in millimetri

comodino.larghezza = 500;

comodino[‘profondità’] = 400;

Page 5: JavaScript Object Oriented

var comodino = {

cassetti : 3,

colore : ‘Bianco’,

altezza : 400,

larghezza : 500,

‘profondità’ : 400

}

Notazione letterale

Page 6: JavaScript Object Oriented

var a = [ ];

typeof a; // risultato: "object“

var misc = [ 3, ‘Bianco’, 400, 500, 400 ];

misc.length; // risultato: 5

Page 7: JavaScript Object Oriented

JSON

var comodino = {

“cassetti” : 3, “colore” : “Bianco”,

“misure” : [

{ “altezza” : 400 },

{ “larghezza” : 500 }, { “profondità” : 400 }

]

}

Page 8: JavaScript Object Oriented

… ma per oggetto si intende forse

istanza di una

classe?

Page 9: JavaScript Object Oriented

Classi!? In JavaScript non esistono

function Comodino(colore, cassetti) {

this.colore = colore;

this.cassetti = cassetti;

return this; // facoltativo

};

var comodino = new Comodino(‘Bianco’, 3);

Il costruttore è una funzione

Page 10: JavaScript Object Oriented

Apriamo una

parentesi sulle

funzioni

Page 11: JavaScript Object Oriented

Le funzioni sono oggetti

Page 12: JavaScript Object Oriented

un contesto di

esecuzione : this

un insieme di valori

passati come

parametri : arguments

un campo contenente

tutto il codice

Page 13: JavaScript Object Oriented

function sum( ) {

var total = 0;

var count = arguments.length;

for(var i = 0; i < count; i++) {

total += arguments[i];

}

return total;

}

variadic function

Page 14: JavaScript Object Oriented

sum( ); // risultato: 0

sum(1, 2, 3, 5, 6, 7); // risultato: 24

Page 15: JavaScript Object Oriented

Una funzione assegnata

alla proprietà di un

oggetto è un metodo

Page 16: JavaScript Object Oriented

var comodino = {

cassetti : 3,

colore : ‘Bianco’,

altezza : 400,

larghezza : 500,

‘profondità’ : 400,

dimensioni : function( ){

return this.larghezza + ‘x’ + this.altezza

+ ‘x’ + this[‘profondità’] + ‘ mm’;

}

}

anonymous function

Page 17: JavaScript Object Oriented

comodino.dimensioni( );

// risultato: 500x400x400 mm

Page 18: JavaScript Object Oriented

Lo scope di una variabile è

limitato alla funzione nella

quale la variabile è stata dichiarata

Page 19: JavaScript Object Oriented

var zoccolo = ’80 millimetri’;

var altezza = function(comodino) {

var altezza_zoccolo = parseInt(zoccolo);

return comodino.altezza

+ altezza_zoccolo;

};

variabile globale Accessibile da tutta

l’applicazione

Page 20: JavaScript Object Oriented

var zoccolo = ’80 millimetri’;

var altezza = function(comodino) {

var altezza_zoccolo = parseInt(zoccolo);

return comodino.altezza

+ altezza_zoccolo;

};

variabile locale

Accessibile solo

all’interno della funzione

Page 21: JavaScript Object Oriented

function foo( ) {

if ( true) {

var zoccolo = ‘80 millimetri’;

}

alert(zoccolo);

};

foo( );

Accessibile solo

all’interno della funzione

Page 22: JavaScript Object Oriented

il contesto

di esecuzione di una funzione

dipende dal

tipo di chiamata

Page 23: JavaScript Object Oriented

Se la funzione è chiamata

come metodo, il contesto è

l’oggetto al quale appartiene

var comodino = {

dimensioni : function( ){

return this.larghezza + ‘x’ + this.altezza

+ ‘x’ + this[‘profondità’] + ‘ mm’;

}

}

Page 24: JavaScript Object Oriented

Se la funzione viene definita

globalmente a livello di

applicazione, il contesto è

l’oggetto globale (window)

var a = 1;

var b = 2;

var c = sum(this.a, this.b);

Page 25: JavaScript Object Oriented

Per una funzione interna il

contesto è quello della

funzione esterna

var a = 5;

var foo = function( ) {

var a = 0;

var f = function(b){

a += b;

};

f(5);

return a;

};

foo(); // risultato: 5

var a = 5;

var foo = function( ) {

var a = 0;

var f = function(b){

this.a += b;

};

f(5);

return a;

};

foo(); // risultato: 0

a = 10

Page 26: JavaScript Object Oriented

Cosa succede se chiamiamo una funzione

globale all’interno di una funzione interna?

var value = 0;

var obj = { value : 5 };

obj.add = function (a) {

var inner = function (){

this.value = sum(this.value, a);

};

inner();

return this.value;

};

obj.add(3);

Qual è il risultato

di obj.add(3)?

Page 27: JavaScript Object Oriented

Cosa succede se chiamiamo una funzione

globale all’interno di una funzione interna?

var value = 0;

var obj = { value : 5 };

obj.add = function (a) {

var inner = function (){

this.value = sum(this.value, a);

};

inner();

return this.value;

};

obj.add(3);

Si riferisce all’oggetto

globale

Page 28: JavaScript Object Oriented

Cosa succede se chiamiamo una funzione

globale all’interno di una funzione interna?

var value = 0;

var obj = { value : 5 };

obj.add = function (a) {

var inner = function (){

this.value = sum(this.value, a);

};

inner();

return this.value;

};

obj.add(3);

Si riferisce all’oggetto

globale

Page 29: JavaScript Object Oriented

Creo una variabile that nel metodo esterno per

passare alla funzione globale il contesto locale

var value = 0;

var obj = { value : 5 };

obj.add = function (a) {

var that = this;

var inner = function (){

that.value = sum(that.value, a);

};

inner();

return this.value;

};

obj.add(3);

Page 30: JavaScript Object Oriented

E se volessimo cambiare il

contesto di esecuzione? Con

il metodo apply si può!

var obj = { value : 5 };

obj.multiply = function(a){

return this.value * a;

};

obj.multiply(3);

var value = 2;

obj.multiply.apply(this, [3]);

parametri:

- nuovo contesto

- array di argomenti

Page 31: JavaScript Object Oriented

Cosa succede se nel creare un oggetto mi

dimentico della parola chiave new?

var value = 0;

function Obj(value){

this.value = value;

};

var obj = Obj(5);

obj.value = 10;

Quale valore ho

modificato?

Page 32: JavaScript Object Oriented

Cosa succede se nel creare un oggetto mi

dimentico della parola chiave new?

var value = 0;

function Obj(value){

this.value = value;

};

var obj = Obj(5);

obj.value = 10;

Quale valore ho

modificato?

Page 33: JavaScript Object Oriented

Lo scope delle variabili di una

funzione viene determinato al

momento della sua definizione e

non quando questa viene eseguita

Page 34: JavaScript Object Oriented

function foo( ) {

var a = 123;

bar( );

};

function bar( ) {

return a;

};

foo(); // risultato: undefined

In esecuzione il ritorno

di “a” da parte di bar()

avviene dopo la dichiarazione di “a”

ma il risultato è …

Lo scope di bar() al

momento della sua definizione è globale

Page 35: JavaScript Object Oriented

function foo( ) {

var a = 123;

bar( );

};

function bar( ) {

return a;

};

foo(); // risultato: undefined

function foo( ) {

var a = 123;

var bar = function( ) {

return a;

};

return bar();

};

foo(); // risultato: 123

Lo scope di bar() al momento

della sua definizione è lo stesso di foo()

Page 36: JavaScript Object Oriented

Le funzioni interne possono

accedere alle variabili e ai

parametri delle funzioni nelle

quali sono definite

Page 37: JavaScript Object Oriented

var a = 14;

function foo( ) {

var b = 10;

function bar( ) {

var c = 3;

alert(a+b+c);

};

bar( );

};

foo(); // mostra 27

c

b

a

bar scope

foo scope

global scope

Page 38: JavaScript Object Oriented
Page 39: JavaScript Object Oriented

“A closure is formed when one of

those inner functions is made

accessible outside of the function in

which it was contained, so that it

may be executed after the outer

function has returned.”

http://jibbering.com/faq/notes/closures/

Page 40: JavaScript Object Oriented

var obj = function ( ) {

var value = 1;

return {

add : function (a) { value += a; },

getValue : function ( ) { return value; }

}

}( );

obj.add(5);

obj.getValue(); // risultato: 6

Page 41: JavaScript Object Oriented

function foo(arg) {

var bar = function(){

return arg;

};

arg++;

return bar;

};

var bar = foo(5);

bar(); // risultato: 6

Page 42: JavaScript Object Oriented

function foo( ) {

var i, array = [ ];

for(i = 0; i < 3; i++) {

array[ i ] = function( ) {

return i;

};

}

return array;

};

var a = foo( );

a[0]( ); // risultato: 3

a[1]( ); // risultato: 3

a[2]( ); // risultato: 3

La funzione anonima

mantiene un riferimento allo

scope del parent

Le tre funzioni puntano

entrambe al valore di “i” terminata l’esecuzione di foo e quindi del loop

Page 43: JavaScript Object Oriented

function foo( ) {

var i, array = [ ];

for(i = 0; i < 3; i++) {

array[ i ] = ( function( j ) {

return function( ) { return j; }

})( i );

}

return array;

};

var a = foo( );

a[0]( ); // risultato: 0

a[1]( ); // risultato: 1

a[2]( ); // risultato: 2

La funzione anonima

accetta “i“ come parametro

Adesso ogni funzione ha

“i” nel suo scope con il valore i-esimo del loop

Page 44: JavaScript Object Oriented

// funzione con una callback come parametro

function foo(a, b, callback) {

var n = (a * b) + b;

callback(n);

}

foo (5, 2, function(n) {

alert("callback result: " + n);

});

anonymous function

Page 45: JavaScript Object Oriented

Chiusa la

parentesi sulle

funzioni

Page 46: JavaScript Object Oriented

In JavaScript non esistono classi …

function Comodino(colore, cassetti) {

this.colore = colore;

this.cassetti = cassetti;

return this; // facoltativo

};

var comodino = new Comodino(‘Bianco’, 3);

Il costruttore è una funzione

Page 47: JavaScript Object Oriented

Ogni funzione ha una proprietà

prototype che è il prototipo degli

oggetti creati con quella funzione

typeof Comodino.prototype // risultato: object

Page 48: JavaScript Object Oriented

Il prototipo mantiene in una proprietà

constructor il riferimento alla funzione

che lo ha generato

typeof Comodino.prototype.constructor

// risultato: Function

Comodino.prototype.constructor

// risultato: Comodino( )

Page 49: JavaScript Object Oriented

Invece che inizializzare gli oggetti nel

costruttore lo posso fare con il prototype

function Comodino( ) { };

Comodino.prototype.cassetti = 3;

Comodino.prototype.colore = ‘Bianco’;

var comodino = new Comodino( );

comodino.cassetti // risultato: 3

Comodino.prototype.isProtoypeOf(comodino); // true

Page 50: JavaScript Object Oriented

L’aggiunta di una proprietà nel prototipo

si riflette su tutti gli oggetti creati con

quel prototipo

function Comodino( ) { };

Comodino.prototype.cassetti = 3;

Comodino.prototype.colore = ‘Bianco’;

var comodino1 = new Comodino( );

var comodino2 = new Comodino( );

Comodino.prototype.altezza = 400;

comodino1.altezza; // risultato: 400

comodino2.altezza; // risultato: 400

augmentation

Page 51: JavaScript Object Oriented

OK, ma non voglio mica tutti gli oggetti

uguali!

Comodino.prototype.altezza = 400;

comodino1.altezza; // risultato: 400

comodino2.altezza; // risultato: 400

comodino1.altezza = 300;

comodino1.altezza ; // risultato: 300

comodino2.altezza; // risultato: 400

comodino1.hasOwnProperty(‘altezza’); // true

comodino1.hasOwnProperty(‘altezza’); // false

shadowing

Page 52: JavaScript Object Oriented

function Comodino(colore, cassetti) {

this.colore = colore;

this.cassetti = cassetti;

};

Comodino.prototype = {

constructor : Comodino,

altezza : 400

};

Page 53: JavaScript Object Oriented

In JavaScript esiste

l’ereditarietà?

Page 54: JavaScript Object Oriented

Interface inheritance

Implementation inheritance

NO

SI

Page 55: JavaScript Object Oriented

Prototype Chaining

Classical Inheritance

Pseudoclassical Inheritance

Prototypal Inheritance

Page 56: JavaScript Object Oriented

Prototype Chaining

Classical Inheritance

Pseudoclassical Inheritance

Prototypal Inheritance

Page 57: JavaScript Object Oriented

function Mobile( ) {

this.materiali = [ ‘Legno’ ];

}

function Comodino( ) {

this.colore = ‘Bianco’;

}

// Comodino eredita da Mobile

Comodino.prototype = new Mobile();

var comodino = new Comodino( );

comodino.materiali[0]; // risultato: “Legno”

prototype chaining

Page 58: JavaScript Object Oriented

...

// Comodino eredita da Mobile

Comodino.prototype = new Mobile();

var comodino1 = new Comodino( );

var comodino2 = new Comodino( );

comodino1.materiali.push(‘Vetro’);

comodino1.materiali; // ”Legno, Vetro”

comodino2.materiali; // ”Legno, Vetro”

Le proprietà impostate nel costruttore

diventano proprietà di prototipo e

quindi condivise

Page 59: JavaScript Object Oriented

Prototype Chaining

Classical Inheritance

Pseudoclassical Inheritance

Prototypal Inheritance

Page 60: JavaScript Object Oriented

function Mobile( ) {

this.materiali = [ ‘Legno’ ];

}

function Comodino( ) {

this.colore = ‘Bianco’;

Mobile.call(this);

}

var comodino1 = new Comodino( );

var comodino2 = new Comodino( );

comodino1.materiali.push(‘Vetro’);

comodino1.materiali; // ”Legno, Vetro”

comodino2.materiali; // ”Legno”

constructor stealing

I metodi devono essere

aggiunti sul costruttore base perché il prototipo non è visibile dai sottotipi

Page 61: JavaScript Object Oriented

Prototype Chaining

Classical Inheritance

Pseudoclassical Inheritance

Prototypal Inheritance

Page 62: JavaScript Object Oriented

La tecnica Pseudoclassical

Inheritance prende il meglio

dai due pattern precedenti,

utilizzando:

• prototype chaining per i

metodi

• constructor stealing per le

proprietà

Page 63: JavaScript Object Oriented

function Mobile( prezzo ) {

this.materiali = [ ‘Legno’ ];

this.prezzo = prezzo;

}

Mobile.prototype.sconto = function( percentuale ) {

return this.prezzo * percentuale / 100;

};

function Comodino( prezzo, colore ) {

// eredita le proprietà

Mobile.call(this, prezzo);

this.colore = colore;

}

// eredita i metodi

Comodino.prototype = new Mobile ();

Page 64: JavaScript Object Oriented

Prototype Chaining

Classical Inheritance

Pseudoclassical Inheritance

Prototypal Inheritance

Page 65: JavaScript Object Oriented

function object(o) {

function F( ) { }

F.prototype = o;

return new F( );

}

var comodino1 = { materiali : [‘Legno’],

colore : ‘Bianco’ };

var comodino2 = object(comodino1);

comodino2.materiali.push(‘Vetro’);

comodino1.materiali; // “Legno”, “Vetro”

Prototypal Inheritance

(2006, Douglas Crockford)

Page 66: JavaScript Object Oriented

Slide 3: http://www.flickr.com/photos/52701968@N00/14954425/

Slide 22: http://www.flickr.com/photos/msutherland1/2372319292/in/photostream/

Slide 53 : http://www.flickr.com/photos/pardeshi/1514977212

Credits Le immagini contenute in questa presentazione

hanno licenza Creative Commons

Page 67: JavaScript Object Oriented

Thank You

MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: [email protected]