Es gibt einen großen Unterschied zwischen der Vererbung von JavaScript und dem Standard -OP -Vererbung. prototype.superClass = c.superClass = P.Prototyp;
Wenn var c = neu c (), c .__ proto__ = c.prototyp;
Wenn c "Mitgliedsvariablen" besucht, werden Sie zu C.Prototypen gehen, um es zu finden, wenn es nicht vorhanden ist, wenn es nicht vorhanden ist. und andere werden während der Definition zugewiesen (jedes Objekt wird zu diesem Zeitpunkt geteilt, wenn "Mitgliedsvariablen" in C.Prototypen zugänglich sind, wenn ein Mitglied des Objekts "Mitgliedsvariable" geändert wird, die Mitglieder der "Mitgliedsvariablen" -Objekte Modifiziert wird von allen Objektinstanzen geteilt, die gegen die ursprüngliche Absicht des Klassengestaltung verstoßen.
Zum Beispiel:
Kopieren Sie den Code -Code wie folgt:
'package'.j (function () {
'Klasse a'.j (function () {
jpublic ({{{{{{{
V: {a: 1}
});
JPrivate ({{{{{
p: {a: 1}
});
jProtect ({{{{{{{{
x: {a: 1}
});
});
'Klasse B erweitert a'.j (function () {
});
});
var b1 = neu B ();
B1.va = 5;
B1.xa = 5;
var b2 = neu B ();
console.log (b1.va) // Ausgabe als 5
console.log (b1.xa) // Ausgabe als 5
Console.log (b2.va) // Ausgabe ist ebenfalls 5, nicht erwartet 1
console.log (b2.xa) // Ausgabe als 1
console.log (b2.pa) // ungeeignet wird es P ohne Existenz fordern
Wie löst ich dieses Problem?
A. Die "Mitgliedsvariable" (selbst ist ein Objekt an sich) wie V ist nicht in der ursprünglichen Kette definiert, sondern wird im Konstruktor aufgerufen. __Proto__.
JS ++ bietet eine ähnliche Methode, solange die in JPrivate definierte "Mitgliedsvariable" oder "Mitgliedsfunktion" auf dem äußeren __Proto __ zugewiesen wird, und nur diese Instanz ist verfügbar.
B. Die "Mitgliedsvariable" liest nur nur auf der Prototypkette (es ist ein Objekt für sich).
Die Mitglieder der "Mitgliedsvariablen" (selbst sind Objekte), die von C.JPublic definiert sind, lesen nur nur Mitglieder, denken Sie daran, nicht zugewiesen zu werden, sonst wird es in verschiedenen Fällen geteilt.