Je pense avoir mal compris comment fonctionne l'héritage prototypique de Javascript. Plus précisément, les variables internes des prototypes semblent être partagées entre plusieurs sous-objets différents. Il est plus facile d'illustrer avec le code:Variables privées dans les prototypes hérités
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());
Ce sorties 1 - 2
(test sur JSBin), alors que j'attendais que le résultat soit 1 - 1
, puisque je voulais deux objets séparés.
Comment puis-je m'assurer que l'objet A
n'est pas un objet partagé entre plusieurs instances de B
?
Mise à jour: This article met en évidence certaines des questions:
Le problème est que la portée de chaque approche utilise pour créer une variable privée, qui fonctionne très bien, est aussi la fermeture, dans l'action, que les résultats Si vous modifiez une variable privée pour une instance d'objet, elle est modifiée pour tous. C'est à dire. c'est plus comme une propriété statique privée qu'une variable privée réelle. Donc, si vous voulez avoir quelque chose de privé, plus comme une constante non publique, l'une des approches ci-dessus est bonne, mais pas pour les variables privées réelles. Les variables privées ne fonctionnent que très bien avec les objets singleton en JavaScript.
Solution: Selon la réponse de BGerrissen, changer la déclaration de B
et partant du prototype fonctionne comme prévu:
var B = function() { A.apply(this, arguments); };
Mais le point ensemble est ici que la fonctionnalité appartient à 'A', et est partagé entre plusieurs sous "classes"(' B', 'C' et 'D'). N'y a-t-il pas de possibilité pour les variables privées non statiques dans les superclasses en Javascript? –
Une façon courante de signifier des intentions «privées» (comme avertir les programmeurs que quelque chose de spécial se passe avec une propriété) consiste à utiliser le trait de soulignement comme préfixe du nom de la propriété (par exemple, obj._privateMember). Bien que cela fonctionne avec l'héritage pour les chaînes et les nombres, il devient plus complexe lorsque vous utilisez des objets et des tableaux en tant que propriétés. – BGerrissen
Je ne comprends pas exactement ce que vous demandez. Voulez-vous qu'une variable définie dans la fonction 'A' soit disponible pour les méthodes de' B', 'C' et' D' mais nulle part ailleurs? Essayez de ne pas penser aux choses en JavaScript en termes de fonctionnalités d'autres langues (telles que Java ou C#). JavaScript n'a tout simplement pas de classes. Il a des objets qui héritent des propriétés d'autres objets via une chaîne prototype. –