2009-11-28 14 views
5

esiste un modo in JavaScript per ereditare i membri privati ​​da una classe base a una sottoclasse?Come ereditare un membro privato in JavaScript?

voglio ottenere qualcosa di simile:

function BaseClass() { 
    var privateProperty = "private"; 

    this.publicProperty = "public"; 
} 

SubClass.prototype = new BaseClass(); 
SubClass.prototype.constructor = SubClass; 

function SubClass() { 
    alert(this.publicProperty); // This works perfectly well 

    alert(this.privateProperty); // This doesn't work, because the property is not inherited 
} 

Come posso realizzare una simulazione di classe simile, come in altri OOP-lingue (ad esempio C++.) Dove posso ereditare (protette) proprietà private?

Grazie, David Schreiber

+0

Questo modello non aggiunge una proprietà privata. Aggiunge solo una variabile locale chiamata privateProperty nella funzione BaseClass. – erikkallen

+1

vedere http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 per la mia opinione su tale lingua bastarda; impara la semantica di JS invece di provare a emulare C++ – Christoph

risposta

11

Utilizzando Douglas Crockfords power constructor pattern (link è quello di un video), è possibile ottenere le variabili protetti in questo modo:

function baseclass(secret) { 
    secret = secret || {}; 
    secret.privateProperty = "private"; 
    return { 
     publicProperty: "public" 
    }; 
} 

function subclass() { 
    var secret = {}, self = baseclass(secret); 
    alert(self.publicProperty); 
    alert(secret.privateProperty); 
    return self; 
} 

Nota: Con il modello costruttore di potere, non si utilizza new. Invece, dì semplicemente var new_object = subclass();.

+0

Grazie mille! Il link al video del modello di power constructor mi ha aiutato molto. Questo era esattamente quello che stavo cercando. Ora capisco che c'è molto di più da imparare su JS e sugli oggetti :-) –

+1

Il link è cambiato; ecco la nuova: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (Il link originale era alla parte 1) –

+1

Non dovrebbe essere 'secret.privateProperty' 'secret.protectedProperty' e quindi private sarebbe qualcosa come' var privateProperty'? – sabgenton

0

Questo non è possibile. E questa non è una proprietà privata - è semplicemente una variabile regolare che è disponibile solo nell'ambito in cui è stata definita.

0

Questo non può essere fatto, ma si potrebbe eliminare la proprietà dal prototipo di classe in modo che non è ereditato:

SubClass.prototype.privateProperty = undefined; 

In questo modo non sarà ereditato, ma è necessario farlo per ogni proprietà "privata" nella tua classe base.

2

Mark tuoi private variabili con qualche tipo di markup come una sottolineatura _ questo modo si sa che è una variabile privata (anche se tecnicamente non lo è)

this._privateProperty = "private"; 
alert(this._privateProperty) 
Problemi correlati