Don P: Referenzen und Objekte bei Javascript

Beitrag lesen

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