Ci sono circa un centinaio di problemi terminologici qui, per lo più costruiti attorno a qualcuno (non tu) che cerca di far sembrare la sua idea come The Best.
Tutti i linguaggi orientati agli oggetti devono essere in grado di gestire diversi concetti:
- incapsulamento dei dati insieme ad operazioni associate sui dati, variamente conosciute come membri e funzioni dei membri, o come dati e metodi, tra le altre cose.
- eredità, la capacità di dire che questi oggetti sono proprio come quell'altro insieme di oggetti TRANNE questi cambiamenti
- polimorfismo ("molte forme") in cui un oggetto decide autonomamente quali metodi devono essere eseguiti, in modo che tu possa dipendere dal linguaggio per indirizzare correttamente le tue richieste.
Ora, per quanto riguarda il confronto:
La prima cosa è l'intera domanda "di classe" vs "prototipo". L'idea era originariamente iniziata in Simula, dove con un metodo basato su classi ogni classe rappresentava un insieme di oggetti che condividevano lo stesso spazio degli stati (leggi "valori possibili") e le stesse operazioni, formando così una classe di equivalenza. Se guardi indietro a Smalltalk, dato che puoi aprire una classe e aggiungere metodi, questo è effettivamente lo stesso di quello che puoi fare in Javascript.
Le lingue OO successive volevano essere in grado di utilizzare il controllo statico dei tipi, quindi abbiamo avuto l'idea di un set di classi fisso al momento della compilazione. Nella versione di classe aperta, hai avuto maggiore flessibilità; nella versione più recente, hai avuto la possibilità di verificare alcuni tipi di correttezza nel compilatore che altrimenti avrebbero richiesto test.
In un linguaggio "di classe", tale copia avviene al momento della compilazione. In un linguaggio prototipo, le operazioni sono archiviate nella struttura dati del prototipo, che viene copiata e modificata in fase di esecuzione. In astratto, tuttavia, una classe è ancora la classe di equivalenza di tutti gli oggetti che condividono lo stesso spazio di stato e metodi. Quando aggiungi un metodo al prototipo, stai effettivamente creando un elemento di una nuova classe di equivalenza.
Ora, perché farlo? principalmente perché crea un meccanismo semplice, logico ed elegante in fase di esecuzione. ora, per creare un nuovo oggetto o per creare una nuova classe, è sufficiente eseguire una copia profonda, copiando tutti i dati e la struttura dati del prototipo. Allora ottieni l'ereditarietà e il polimorfismo più o meno gratuitamente: la ricerca del metodo consiste sempre nel chiedere un dizionario per un'implementazione del metodo per nome.
Il motivo che è finito nello script Javascript / ECMA è fondamentalmente che quando abbiamo iniziato con questo 10 anni fa, avevamo a che fare con computer molto meno potenti e browser molto meno sofisticati. Scegliere il metodo basato sul prototipo significava che l'interprete poteva essere molto semplice preservando le proprietà desiderabili dell'orientamento agli oggetti.