DaBear: Referenzen und Objekte bei Javascript

Beitrag lesen

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.

Ja, ich denke mir ist jetzt klar, warum es so funktioniert, wie es funktioniert. Das ist doch schonmal gut =)

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"?

Das hat aber Nachteile. Nämlich erstens, dass ich in A eine solche Methode schreiben muss (was ich vielleicht gar nicht kann, weil ich die A Interna gar nicht kenne[n will]). Zweitens, dass ich das nächste mal wenn ich in A irgendetwas ändere auch diese Methode anpassen muss. Das erhöht die Fehleranfälligkeit, denn wenn ich einfach ein neues A erzeuge, kann ich zu 100% sicher sein, dass ich eine frische Instanz habe.

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

Warum nicht?

Weil das das Befehlsmuster unterlaufen würde. Dann hat der Befehl ja nichts mehr zu tun. Das führt dann auch dazu, dass ich in der Klasse C Code-Teile drin habe, die dort semantisch nichts zu suchen haben.

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.

Ich möchte aber nicht dass Array in A löschen, sondern die ganze Instanz von A durch eine frische Instanz ersetzen. Oder worauf wolltest du hinaus?