[javascript] Benefici dell'ereditarietà prototipale rispetto al classico?


Answers

Consentitemi di rispondere effettivamente alla domanda in linea.

L'ereditarietà del prototipo ha le seguenti virtù:

  1. È più adatto ai linguaggi dinamici perché l'ereditarietà è dinamica quanto l'ambiente in cui si trova. (L'applicabilità a JavaScript dovrebbe essere ovvia qui.) Ciò ti permette di fare le cose rapidamente al volo come personalizzare le classi senza enormi quantità di codice di infrastruttura .
  2. È più semplice implementare uno schema di oggetti di prototipazione rispetto agli schemi classici di dicotomia classe / oggetto.
  3. Elimina la necessità degli spigoli complessi attorno al modello oggetto come "metaclasses" (non ho mai incontrato il metaclass che mi è piaciuto ... scusate!) O "autovalori" o simili.

Tuttavia presenta i seguenti svantaggi:

  1. Digitare il controllo di un linguaggio prototipo non è impossibile, ma è molto, molto difficile. La maggior parte del "controllo del tipo" dei linguaggi prototipici è puro controllo "digitazione anatra" in fase di esecuzione. Questo non è adatto a tutti gli ambienti.
  2. È ugualmente difficile fare cose come ottimizzare l'invio del metodo mediante analisi statiche (o, spesso, anche dinamiche!). Può (sottolineo: può ) essere molto inefficiente molto facilmente.
  3. Allo stesso modo la creazione di oggetti può essere (e di solito è) molto più lenta in un linguaggio di prototipazione di quanto non lo sia in uno schema di dicotomia di classe / oggetto più convenzionale.

Penso che tu possa leggere tra le righe sopra e trovare i vantaggi e gli svantaggi dei tradizionali schemi di classe / oggetto. Ci sono, ovviamente, di più in ogni area, quindi lascerò il resto alle altre persone che rispondono.

Question

Così alla fine ho smesso di trascinarmi in tutti questi anni e ho deciso di imparare JavaScript "correttamente". Uno degli elementi più problematici del design linguistico è l'implementazione dell'ereditarietà. Avendo esperienza in Ruby, ero davvero felice di vedere chiusure e digitazione dinamica; ma per la vita di me non riesco a capire quali benefici si debbano ottenere dalle istanze di oggetti che usano altre istanze per ereditarietà.




In Javascript, con modal prototipale, non puoi eseguire instanceOf. Puoi con il modello classico. Ho intenzione di mettere un link qui per te. www.objectplayground.com Il miglior video che parla del prototipo di Javascript.

Con l'arrivo di ECMA 6, Javascript supporterà la nuova sintassi di classe. Quindi VERO modello classico sta arrivando.

Il futuro si attiene al modello classico.




Non c'è davvero molto da scegliere tra i due metodi. L'idea di base è che quando il motore JavaScript riceve una proprietà di un oggetto da leggere, prima controlla l'istanza e se quella proprietà è mancante, controlla la catena del prototipo. Ecco un esempio che mostra la differenza tra prototipo e classica:

prototipale

var single = { status: "Single" },
    princeWilliam = Object.create(single),
    cliffRichard = Object.create(single);

console.log(Object.keys(princeWilliam).length); // 0
console.log(Object.keys(cliffRichard).length); // 0

// Marriage event occurs
princeWilliam.status = "Married";

console.log(Object.keys(princeWilliam).length); // 1 (New instance property)
console.log(Object.keys(cliffRichard).length); // 0 (Still refers to prototype)

Classico con metodi di istanza (Inefficiente perché ogni istanza memorizza la propria proprietà)

function Single() {
    this.status = "Single";
}

var princeWilliam = new Single(),
    cliffRichard = new Single();

console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 1

Classico efficiente

function Single() {
}

Single.prototype.status = "Single";

var princeWilliam = new Single(),
    cliffRichard = new Single();

princeWilliam.status = "Married";

console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 0
console.log(cliffRichard.status); // "Single"

Come potete vedere, poiché è possibile manipolare il prototipo di "classi" dichiarate in stile classico, non vi è alcun vantaggio nell'utilizzo dell'ereditarietà prototipale. È un sottoinsieme del metodo classico.






Links