Hallo,
So besser?
Ja, allerdings.
function A(a)
{
var a = a;this.ausgeben = function ausgeben()
{
return a;
}
}function B(a)
{
var a = a;this.tuwas = function tuwas()
{
a = new A(new Array());
//a ausgeben
}
}function C(meinarray)
{
var meinA = new A(meinarray);this.tuwas2 = function tuwas2()
{
var meinB = new B(meinA);
meinB.tuwas();
//Ausgabe von meinA
}this.ausgeben = function ausgeben()
{
return meinA.ausgeben();
}
}var c = new C(new Array("1", "2", "3"));
//meinA hat jetzt das Array gespeichert
Genauer: c verweist jetzt auf ein C-Objekt, und das kennt eine Variable meinA, die auf ein A-Objekt verweist, welches eine Variable a kennt, die auf das übergebene Array verweist.  
  
> c.tuwas2();  
> //Gibt jetzt kein leeres Array aus, sondern das Array mit den 3 Strings  
  
c.tuwas2 erzeugt und speichert zunächst in meinB ein B-Objekt, welches das A-Objekt (meinA) als Parameter bekommt und dieses in seiner Variablen a speichert:  
>       `var meinB = new B(meinA);`{:.language-javascript}  
  
Dann ruft c.tuwas2 noch die Methode tuwas seines B-objekts auf, die seine eigene Variable a mit einem leeren Array überschreibt (nur im B-objekt):  
  
>       `meinB.tuwas();`{:.language-javascript}  
Ausgegeben wird dabei nichts.  
  
> `c.ausgeben()`{:.language-javascript}  
Die ausgeben-Methode des C-Objekts ruft nun die gleichnamige Methode seines in meinA gespeicherten A-Objekts auf, welche das in seiner Variablen a nach wie vor referenzierte, ursprüngliche Array zurückgibt.  
  
Was hast du erwartet?  
Das B-Objekt kann seine eigene Variable a so oft überschreiben wie es will, kein anderes Objekt bekommt davon etwas mit.  
  
> Wenn ich von B hingegen eine Methode von A aufrufen lassen, mit der A etwas in sich selbst ändert, dann bleibt die Änderung "für immer".  
  
Ist klar.  
  
> Wie erreiche ich es nun, dass B quasi A "löscht"?  
  
Vielleicht, indem es "hingegen eine Methode von A" aufruft, "mit der A etwas in sich selbst ändert" ?  
  
> Ich könnte in tuwas2() natürlich einfach "meinA = new A(new Array());" schreiben, aber das möchte ich nicht.  
  
Warum nicht?  
  
> Geht das auch anders?  
  
Wenn du – wie im gezeigten Beispiel – sogenannte Closures verwendest (deine Variablen a in den A- und B-Objekten) dann kann auf diese nur von Methoden der Objekte zugegriffen werden, in denen sie auch definiert sind: Eine Methode im Konstruktor von A kann auf die Variable a einer A-Instanz zugreifen, und eine eine Methode im Konstruktor von B kann auf die Variable a einer B-Instanz zugreifen.  
  
Aber die Methode eine B-Instanz kann niemals direkt auf die Variable a einer A-Instanz zugreifen, und umgekehrt auch nicht.  
  
Wenn allerdings noch woanders eine Referenz auf denselben Wert existiert – also hier das Array – dann kann man diese andere Referenz verwenden, um das Array zu ändern, auf das in Closure-Variablen verwiesen wird.  
  
Gruß, Don P  
 nicht angemeldet
 nicht angemeldet