Come già suggerito dagli altri commentatori e dagli articoli che hanno collegato, l'eredità differenziale è "solo" l'eredità prototipo normale e nota.
Eppure usando il termine ereditarietà differenziale ci si concentra su un modello più puro di quanto sia noto in JavaScript (anche se abbastanza comune in altri linguaggi prototipo come Self, NewtonScript o Io). A differenza del pattern pseudo-classico, non ci sono costruttori con l'utilizzo di new
. Invece, utilizzando Object.create
si crea un nuovo oggetto che eredita dall'oggetto di destinazione in un unico passaggio e quindi si creano le proprietà di istanza necessarie (solo quelle che sono diverse) manualmente (non con un costruttore). Non è insolito per ereditare da un oggetto che si considera di essere un esempio altrimenti, invece che da un oggetto prototipo dedicato.
var object = Object.prototype;
// a Person constructor and a Person.prototype method would be more familiar
var person = Object.create(object);
person.greet = function() {
console.log("Hi, I'm "+this.firstName+" "+this.lastName);
};
// as would new Person("John", "Doe");
var jo = Object.create(person);
jo.firstName = "John";
jo.lastName = "Doe";
// but what now? We stay with "simple" Object.create here
var ja = Object.create(jo);
ja.firstName = "Jane";
jo.greet();
ja.greet();
Come si può vedere la creazione di una Jane è semplice, ma avremmo dovuto rompere con il modello new Constructor()
se avessimo usato. È per questo che alcuni guru JS stanno sostenendo per utilizzare il modello di pura ovunque (in modo da capire meglio cosa sta succedendo) e sono felice di aver avuto Object.create
con EcmaScript 5.
Eppure, utilizzando il modello di costruzione e la costruzione di gerarchie di classi convenzionali è comune e utile, e certamente possibile in linguaggi prototipici. Io per esempio chiamerà un metodo init
(se esistente) ogni volta che si clone
un oggetto, e nell'esempio di cui sopra avrebbe potuto usare uno pure che avrebbe reso l'inizializzazione di Joe semplice:
person.init = function(f, l) {
this.firstName = f; this.lastName = l; return this;
}
var jo = Object.create(person).init("John", "Doe");
c'è sicuramente alcun linea retta di distinguere tra differenziale e prototipo ereditarietà.
A quanto pare, ["ereditarietà differenziale"] (https://en.wikipedia.org/wiki/Diversential_inheritance) è solo un altro modo di dire "eredità prototipale". – rid
[Questo potrebbe descrivere meglio.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –
@SheikhHeera: In realtà non lo è, perché l'esempio fornito non funziona ed è almeno fuorviante. – Bergi