2016-01-10 24 views
6

ho trovato questa definizione qui: https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95#.y0nc8kx34Differenza tra eredità classica e prototipi eredità

Non sembra imbarazzante a voi? Questa definizione ha senso? Per me in entrambi i casi c'è un uso di un costruttore (con new è possibile sovrascrivere l'oggetto restituito che è tutto) e in entrambi i casi c'è un'eredità di prototipo. Mi manca qualcosa o la definizione di cui sopra non è veramente accurata?

* 3. Qual è la differenza tra ereditarietà classica e eredità prototipale?

Ereditarietà delle classi: le istanze ereditano dalle classi (come un modello, una descrizione della classe) e creano relazioni di sottoclasse: tassonomie di classe gerarchica. Le istanze sono tipicamente istanziate tramite le funzioni di costruzione con la parola chiave new. L'ereditarietà di classe può o non può utilizzare la parola chiave class da ES6.

Eredità prototipale: le istanze ereditano direttamente da altri oggetti. Le istanze sono tipicamente istanziate tramite le funzioni di fabbrica o Object.create(). Le istanze possono essere composti da molti oggetti diversi, consentendo una facile eredità selettivo. *

+0

Questo non è giusto a tutti. Anche usando la sintassi 'class' in ES6, è ancora un'eredità prototipale. La differenza non riguarda la sintassi della dichiarazione utilizzata, ma il modo in cui funziona in pratica. – jfriend00

+0

Beh, si dice "tipicamente". Non c'è però un'ereditarietà classica in JS, solo la sintassi che nasconde l'eredità prototipale. – MinusFour

+0

Lo so bene. Sento che l'autore non capisce veramente come funziona l'ereditarietà di javascript e lo mescola con altre più tipiche conoscenze delle lingue OO, ma voglio essere sicuro che non mi manchi niente prima di incolparlo. –

risposta

3

In JavaScript, ereditarietà di classe è implementato in cima alla ereditarietà prototipale, ma questo non significa che fa la stessa cosa:

Oltre alle proprietà che ereditano, di ereditarietà di classe non cavo aggiuntivo per collegare il bambino [[Prototipo]] al genitore [[Prototipo]]. Di solito viene chiamato anche il costruttore super(). Questi passaggi aggiuntivi formano le gerarchie padre/figlio e creano l'accoppiamento più stretto disponibile nella progettazione OO.

Quindi, "classi ereditano dalle classi e creare relazioni sottoclasse:. Tassonomie di classe gerarchica"

E 'anche utile per capire che c'è più di un tipo di OO prototipale. È importante sottolineare che esiste l'ereditarietà concatenativa e del prototipo.

L'ereditarietà concatenativa è importante, perché è ciò che consente la composizione di un oggetto semplice (e molto comune) in JavaScript. Ricorda la Gang of Four ha detto, "favorire la composizione dell'oggetto sull'eredità di classe".

Questo è generalmente accettato dal punto di vista del design OO, e grazie all'ereditarietà concatenativa, è un gioco da ragazzi farlo in JavaScript.

Per molti più dettagli, vedere "Master the JavaScript Interview: What's the Difference Between Class and Prototypal Inheritance?"

+0

Grazie per la risposta! Quindi, l'eredità prototipale non crea un collegamento con il genitore [[Prototipo]]? E significa che non posso creare una gerarchia profonda di classi/oggetti con il prototipo? –

+0

Che dire della differenza semantica? Sei d'accordo con la mia risposta? –

+0

L'ereditarietà concatenativa non crea una gerarchia di classi/oggetti, no. È possibile creare tali gerarchie con la delega del prototipo, ovvero l'implementazione dell'ereditarietà della classe in JavaScript. Sì, c'è una differenza semantica tra classe e sì, sono d'accordo con la tua definizione, con l'avvertenza che ** 'class' e tipi non sono affatto analoghi in JavaScript **.I programmatori si aspettano che siano, che è una fonte comune di confusione. –

4

Ci sono interfaccia e semantiche differenze tra "classe" e "prototipo".

differenza interfaccia

come usarlo nel codice. Differenza e benefici ben spiegati nell'articolo.

differenza semantica

Non importa come viene implementato in JavaScript, possiamo usare ES6 classe a sottolineare che il nostro oggetto è la "classe" che significa. Originariamente "classe" significa che siamo in grado di classe se alcuni oggetti a uno o un altro insieme di oggetti. Vedi definizione in set theory: https://en.wikipedia.org/wiki/Class_(set_theory).

Inoltre, la classe è qualcosa di astratto e non esiste prima di creare un'istanza.

Se parliamo di ereditarietà delle classi - è semplice capire l'astrazione che alcune classi possono essere una sottoclasse di un'altra classe che crea la gerarchia.

Il prototipo è un oggetto campione o rappresentativo di alcuni gruppi di oggetti. in quel caso creiamo nuovi oggetti usando il prototipo esistente (creando clone o link). E possono anche essere prototipi di nuovi oggetti.

Quando altri programmatori potranno leggere il codice e vedere ciò che si sceglie - prototipo o classe, si aspettano quei significati semantici.

+0

'class' e i tipi non sono affatto analoghi in JavaScript. I programmatori si aspettano che siano, che è una fonte comune di confusione. –