2013-07-21 10 views
8

Questo answer on Object.create() method in JavaScript in SO parla dell'eredità differenziale . Si va avanti a dire questo:Che cos'è l'ereditarietà differenziale in JavaScript?

Questo metodo consente di implementare facilmente eredità differenziale, dove gli oggetti possono direttamente ereditare da altri oggetti.

Per quanto ne so, JavaScript consente sempre agli oggetti di ereditare direttamente da altri oggetti tramite l'ereditarietà prototipale. Non esiste il concetto di una classe di in JavaScript. Così che cosa differenziale eredità significa veramente e perché si chiama così?

P.S: Ho lasciato cadere un commento su quella risposta qualche tempo fa ma non ho ricevuto alcuna risposta. Quindi volevo verificare con la più grande e meravigliosa comunità di utenti SO JavaScript.

+6

A quanto pare, ["ereditarietà differenziale"] (https://en.wikipedia.org/wiki/Diversential_inheritance) è solo un altro modo di dire "eredità prototipale". – rid

+1

[Questo potrebbe descrivere meglio.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –

+0

@SheikhHeera: In realtà non lo è, perché l'esempio fornito non funziona ed è almeno fuorviante. – Bergi

risposta

8

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à.

+0

Invece di usare 'init()', 'Object.create()' ha un secondo argomento: le proprietà. Questo può essere usato per popolare le proprietà dell'istanza in modo più elegante, come descritto nel link OP (http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new/2709811#2709811). – Ben

+1

@Steve: più elegantemente? Ne dubito, in quanto * descrittori di proprietà * non semplici proprietà. Ciò include un grande numero di regole se vuoi proprietà "normali" (scrivibili, enumerabili). – Bergi

+0

vero, buon punto - un sacco di spese generali lì :) – Ben

Problemi correlati