javascript-logo-bw

Classi ed Ereditarietà con Prototype.js

Appunti sull’ uso di Prototype: http://prototypejs.org

Definizione di classi e sotto-classi

Le più recenti versioni di Prototype (>=1.6) definiscono il metodo Class.create() che consente di lavorare con le classi evitando di dover usare i “prototipi” o il metodo Class.extend() per copiare le proprietà alle sottoclassi.

Con Prototype si procede così:

// le proprietà vengono passate a create()
var Person = Class.create({
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
});
// Sottoclasse
var Pirate = Class.create(Person, {
  // Ridefinizione del metodo say
  say: function($super, message) {
    return $super(message) + ', yarr!';
  }
});

Vediamo nel dettaglio il metodo Class.create() e la parola chiave $super:

Class.create()

Questo metodo non funziona solo con le classi, ma più in generale funziona con tutti i moduli:
se definiamo un modulo contenente funzioni e variabili, e una classe, possiamo fonderli in un’ unica classe.

// Definizione di un modulo
var Vulnerable = {
  wound: function(hp) {
    this.health -= hp;
    if (this.health < 0) this.kill();
  },
  kill: function() {
    this.dead = true;
  }
};

// il primo argomento non è una classe !
// si ottiene comunque una fusione delle proprietà
var Person = Class.create(Vulnerable, {
  initialize: function() {
    this.health = 100;
    this.dead = false;
  }
});

var bruce = new Person;
// metodo ricevuto dal modulo
bruce.wound(55);
// proprietà ricevuta dal modulo
bruce.health; //-> 45

Analogamente, se il primo argomento di Class.create() è una classe, si ereditano le sue proprietà.

$super

Quando si ridefinisce un metodo, usando $super come primo argomento si ottiene un riferimento al metodo originario: ma dall’ esterno il metodo ridefinito si aspetta tutti gli argomenti definiti, tranne $super, è come se non ci fosse.

Definizione di proprietà

Attualmente Javascript è basato sull’ ereditarietà prototipale: questo significa che le proprietà sono passate per riferimento.
In parole povere, una proprietà risulta essere come “statica”, cioè uguale per tutte le istanze della classe, a meno che non la si definisca come “proprietà di istanza” usando this.proprietà.

Definizione di metodi

I metodi possono essere aggiunti ad una classe semplicemente scrivendone il nome ed il corpo della funzione.
Per aggiungerne molti in una volta sola, si usa il metodo di Javascript Object.Extend(classname, { }).
Ma in questo modo ci sono problemi legati all’ ereditarietà ed alla propagazione dei metodi alle sottoclassi.

Usando Class.create() e poi Class.addMethods() questo problema viene superato: i nuovi metodi saranno disponibili per tutte le sottoclassi e persino per gli oggetti istanze di sottoclassi già istanziati !

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...