Privacy nell'eredità prototipale

0

La gente dice che tutto in The prototypal inheritance è pubblico Ma possiamo raggiungere la privacy usando le chiusure nel costruttore giusto?

function Cons(id){
this.name='Hermit';
this.check=function(){
console.log(id);
}
}

Quindi, perché in ogni singolo libro che ho presentato, dicono che l'ereditarietà del prototipo è globale e non implica la privacy?

    
posta Mohan Pierce 21.06.2018 - 08:48
fonte

1 risposta

3

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.

    
risposta data 21.06.2018 - 09:14
fonte

Leggi altre domande sui tag