2009-11-28 7 views
5

Y at-il un moyen en JavaScript pour hériter des membres privés d'une classe de base à une sous-classe?Comment hériter d'un membre privé en JavaScript?

Je veux réaliser quelque chose comme ceci:

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 
} 

Comment puis-je obtenir une simulation de classe semblable, comme dans d'autres langues oop (par exemple C++.) Où je peux hériter des propriétés privées (protégées)?

Merci, David Schreiber

+0

Ce modèle n'ajoute pas de propriété privée. Il ajoute seulement une variable locale appelée privateProperty dans la fonction BaseClass. – erikkallen

+1

voir http://stackoverflow.com/questions/1437712/how-to-override-vrivable-variable-in-javascript/1438592#1438592 pour mon opinion sur une telle bastardisation de langue; apprendre la sémantique de JS au lieu d'essayer d'émuler C++ – Christoph

Répondre

11

En utilisant Douglas Crockfords power constructor pattern (lien est une vidéo), vous pouvez obtenir des variables protégées comme ceci:

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; 
} 

note: Avec le modèle constructeur de puissance, vous n'utilisez pas new. Au lieu de cela, dites simplement var new_object = subclass();.

+0

Merci beaucoup! Le lien vers la vidéo du modèle du constructeur de puissance m'a beaucoup aidé. C'était exactement ce que je cherchais. Maintenant, je comprends qu'il y a beaucoup plus pour moi d'apprendre sur JS et les objets :-) –

+1

Le lien a changé; voici le nouveau: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (Le lien d'origine était à la partie 1) –

+1

Ne devrait pas 'secret.privateProperty' être 'secret.protectedProperty' et privé serait quelque chose comme' var privateProperty'? – sabgenton

0

Ce n'est pas possible. Et ce n'est pas vraiment une propriété privée - c'est simplement une variable régulière qui n'est disponible que dans la portée dans laquelle elle a été définie.

0

Cela ne peut être fait, mais vous pouvez supprimer la propriété du prototype de la classe afin qu'il ne soit pas hérité:

SubClass.prototype.privateProperty = undefined; 

Ainsi il ne sera pas héritée, mais vous devez faire pour chaque propriété "privée" de votre classe de base.

2

Mark vos privées variables avec une sorte de balisage comme un underscore _ De cette façon, vous savez qu'il est une variable privée (bien que techniquement il n'est pas)

this._privateProperty = "private"; 
alert(this._privateProperty) 
Questions connexes