Comment hériter d'un membre privé en JavaScript?
-
06-07-2019 - |
Question
Existe-t-il un moyen en JavaScript d'hériter des membres privés d'une classe de base vers une sous-classe?
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 type classe, comme dans d'autres langages oop (par exemple, C ++) où je peux hériter de propriétés privées (protégées)?
Merci David Schreiber
La solution
En utilisant le modèle de constructeur d’alimentation de Douglas Crockfords (lien vers une vidéo), vous pouvez obtenir des variables protégées comme celle-ci:
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;
}
Remarque: avec le modèle de constructeur de puissance, vous n'utilisez pas new
. Dites plutôt var new_object = subclass ();
.
Autres conseils
Marquez vos variables privées avec une sorte de balisage comme un tiret bas _ De cette façon, vous savez que c'est une variable privée (bien que ce ne soit techniquement pas le cas)
this._privateProperty = "private";
alert( this._privateProperty )
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.
Cela ne peut pas être fait, mais vous pouvez supprimer la propriété du prototype de classe afin qu'elle ne soit pas héritée:
SubClass.prototype.privateProperty = undefined;
Ainsi, il ne sera pas hérité, mais vous devez le faire pour chaque "privé". propriété dans votre classe de base.