Il y a une grande différence entre l'héritage de JavaScript et l'héritage standard de l'OOP. prototype.Superclass = C.Superclass = p.prototype;
Lorsque var c = new C (), c .__ proto__ = c.prototype;
Lorsque C visite les «variables des membres», si __proto__ ne peut pas être obtenu, vous ira à C.Protype pour le trouver. et d'autres sont alloués pendant la définition (chaque objet est partagé). Modified sera partagé par toutes les instances d'objets, ce qui viole l'intention d'origine de la conception de la classe.
Par exemple:
Copier le code du code comme suit:
'package'.j (function () {
'Class A'.j (function () {
jpublic ({{{{
V: {a: 1}
});
jprivate ({{
p: {a: 1}
});
jprotect ({{
x: {a: 1}
});
});
'La classe B étend a'.j (function () {
});
});
var b1 = new b ();
b1.va = 5;
b1.xa = 5;
var b2 = new b ();
console.log (b1.va) //
console.log (b1.xa) //
Console.log (b2.va) // La sortie est également 5, non attendue 1
console.log (b2.xa) //
Console.log (b2.pa) // non habile, il incitera p sans existence
Comment résoudre ce problème?
A. La "variable de membre" (elle-même est un objet en soi) tel que V n'est pas défini sur la chaîne d'origine, mais est appelée dans le constructeur. __proto__.
JS ++ fournit une méthode similaire, tant que la "variable membre" ou "fonction membre" définie dans JPrivate est allouée sur le __proto extérieur, et seule cette instance est disponible.
B. La "variable de membre" ne se lit que unique sur la chaîne prototype (c'est un objet en soi)
Les membres des "variables membres" (lui-même sont des objets) définis par C.Jpublic, je viens de lire uniquement les membres, n'oubliez pas de ne pas être attribué, sinon il sera partagé dans divers cas.