molily: Referenzen und Objekte bei Javascript

Beitrag lesen

function A(a)
{
   var a = a;

Diese Zuweisung ist Quatsch. a ist schon eine lokale Variable. var a = a; hat keinen Effekt. Du kannst die ganze Zeile weglassen.

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
c.tuwas2();
//Gibt jetzt kein leeres Array aus, sondern das Array mit den 3 Strings
c.ausgeben()

Wie kommst du darauf, dass es einen leeren Array ausgeben sollte?

Wieso sollte sich an dem Wert von meinA etwas ändern, wenn du eine B-Instanz erstellst, ihr meinA übergibst und in einer B-Methode den Wert dieses Konstruktor-Parameters änderst?

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".
Wie erreiche ich es nun, dass B quasi A "löscht"?

Anscheinend missverstehst du, wie private Objekte funktionieren. Und du missverstehst, dass sich der Wert einer Variablen nicht ändert, wenn du einer anderen Variable, die vorher zufällig denselben Wert hat, einen anderen zuweist.

Du machst hier im Grunde folgendes:

var a = 1;
var b = a;
b = 2;
alert(a);

und wunderst dich, dass a nicht gleich 2 ist.

Du übergibst eine A-Instanz als Parameter an den B-Konstruktor. Dort wird eine lokale Variable erzeugt, die in den verschachtelten Methoden (Closures) verfügbar ist. Wenn du dieser lokalen Variablen nun einen neuen Wert gibst, so ändert sich doch nicht automatisch der Wert der Variable meinA in einer C-Instanz.

Ich könnte in tuwas2() natürlich einfach "meinA = new A(new Array());" schreiben, aber das möchte ich nicht.

Wieso nicht? Wieso sollte eine andere (Pseudo-)Klasse auch die private Variable der C-Instanz ändern dürfen? Dann ergäbe die Trennung ergäbe keinen Sinn.

Geht das auch anders?

Dein Beispiel ist äußerst wirr. Wieso wrappst du einen Array mehrere Male? Zeige mal ein tatsächliches Beispiel ohne A, B und C, sondern mit einem nachvollziehbaren Anwendungsfall.

Mathias