Si prega di fare una distinzione tra le caratteristiche del linguaggio astratto come l'ereditarietà prototipale e la loro implementazione in linguaggi specifici come JavaScript.
L'eredità prototipale non impedisce di per sé concetti come l'accesso pubblico / privato. L'accesso protetto non può esistere in modo significativo perché ogni oggetto delega i messaggi non gestiti al suo prototipo, cioè un normale client del prototipo (oltre a impostare this
).
In un sistema OOP puro, la visibilità privata non è significativa in quanto gli oggetti sono definiti esclusivamente attraverso la loro interfaccia pubblica. Qualsiasi altra cosa è un dettaglio di implementazione di quell'oggetto. Tuttavia, questa visualizzazione non è molto utile in pratica.
La maggior parte dei linguaggi dinamici (inclusi Smalltalk, Perl, Python, JavaScript, ...) non ha una rigida applicazione della visibilità del metodo / campo. Invece, la maggior parte si basa sulle convenzioni. La ragione pratica per questo è che dovresti decidere se è stata effettuata una chiamata privata all'interno di un oggetto. In un linguaggio statico come Java, è facile decidere in fase di compilazione, ma non in JavaScript, in cui è possibile applicare patch ai metodi in modo dinamico in un oggetto. Infatti, JavaScript non ha alcun concetto di compilazione vs fase di esecuzione. Alcuni approcci, ad es. in Python prova a ispezionare il callstack e genera un'eccezione di runtime quando viene chiamato un metodo "privato", ma quelle soluzioni sono fragili e implicano un sovraccarico di runtime.
Hai perfettamente ragione a poter utilizzare le chiusure per avere accesso privato ai dati. Ma questo è ortogonale all'eredità prototipica. Mentre inusuale, potrei usare approcci simili in un linguaggio basato su classi come Python, anche se ora otterrei una nuova classe per ogni oggetto (perché i metodi devono chiudersi su diversi dati privati).
Il risultato è che è possibile esprimere oggetti con uno stato veramente privato in JavaScript, ma ciò non è dovuto a caratteristiche fondamentali o restrizioni dell'ereditarietà prototipica, ma a causa della combinazione della caratteristica del linguaggio "eredità prototipica" con la maggior parte non correlata " chiusure "funzionalità della lingua.