MB: pass by reference in TypeScript Klassen

moin,

ich will ein Objekt dessen Property ändern. In PHP geht das super mit dem $vor dem Funktionsparameter einer Methode. Ich hab irgendwo gelesen das man das nur als Objekten im Parameter einer Methode machen kann. Ich habs aber nicht hinbekommen. Mein Code ...

class Bar {
    
    public baz = {
            name : "a"
    }
}

class Foo {
    
    public bar : Bar = new Bar;
    
    public change( property ) {
        console.log( "change: " + property['name'] );
        property = { name: "b" }; // ueberschreibt in der methode
        console.log( "change: " + property['name'] );
    }
}
var foo = new Foo;

console.log( foo.bar ); // noch unverändert

foo.change( foo.bar.baz );

console.log(d.u.prop.name ); // soll aenderung vollzogen sein

außerhalb soll das funktionieren :/. Für Literatur hinweise die dieses Thema behandelt wäre ich aber auch dankbar.

vlg MB

  1. Tach!

    ich will ein Objekt dessen Property ändern. In PHP geht das super mit dem $vor dem Funktionsparameter einer Methode.

    Du meinst & und das brauchst du auch nur, wenn es sich um skalare Werte handelt.

    Ich hab irgendwo gelesen das man das nur als Objekten im Parameter einer Methode machen kann. Ich habs aber nicht hinbekommen. Mein Code ...

    Javascript hat dieselbe Regel, nur dass man nicht explizit eine Referenz verlangen kann. Die gibts per se bei Objekten und nicht bei primitiven Typen.

    
    >     public change( property ) {
    >         property = { name: "b" }; // ueberschreibt in der methode
    
    

    Dein Problem lässt sich herunterbrechen auf diese beiden Zeilen. In property steht nach dem Funktionsaufruf eine Referenz zu deinem Unterobjekt. Du weist dieser Variablen allerdings nun ein neues Objekt zu. Wenn du hingegen das Ziel der Referenz ändern möchtest, musst du mit der Referenz arbeiten und sie nicht überschreiben. Also property.name="b" oder property['name']="b"

    Übrigens, das public kannst du weglassen, das ist der Default-Wert. Lediglich private und protected sind notwendig, um dem Typescript-Transpiler Verwendungshinweise zu geben, damit er beim Verstoß dagegen meckern kann.

    dedlfix.

    1. Moin dedlfix,

      Dein Problem lässt sich herunterbrechen auf diese beiden Zeilen. In property steht nach dem Funktionsaufruf eine Referenz zu deinem Unterobjekt. Du weist dieser Variablen allerdings nun ein neues Objekt zu. Wenn du hingegen das Ziel der Referenz ändern möchtest, musst du mit der Referenz arbeiten und sie nicht überschreiben. Also property.name="b" oder property['name']="b"

      Vielen Dank. Die Hilfe war von Erfolg gekrönt. Ich habs getestet und es funzt.

      Übrigens, das public kannst du weglassen, das ist der Default-Wert.

      Das weis ich :). Ich will es wegen der Ordnung - meiner Ordnung - des Codes schaffen. Mir ist es unangenehm wenn etwas gegen ein Muster läuft. Ich das war schon immer so neben bei.

      Nochmals Danke für deine Hilfe

      vlg MB

    2. Tach!

      Ich hab irgendwo gelesen das man das nur als Objekten im Parameter einer Methode machen kann. Ich habs aber nicht hinbekommen. Mein Code ...

      Javascript hat dieselbe Regel, nur dass man nicht explizit eine Referenz verlangen kann. Die gibts per se bei Objekten und nicht bei primitiven Typen.

      Um das nochmal etwas klarer zu formulieren. PHP hat das übliche Verhalten bei der Übergabe von Parametern an Funktionen.

      $baz = new stdClass;
      $baz.qux = ...;
      
      foo($baz);
      
      function foo($bar) {
        $bar.qux = ...; // schreibt einen neuen Wert in $baz.qux
        $bar = ...; // überschreibt nur das lokale $bar; $baz bleibt unbehelligt
      }
      

      Das ist in einer vergleichbaren Form auch in anderen Sprachen implementiert, zum Beispiel in Javascript.

      PHP hat nun noch eine zusätzliche Besonderheit mit dem &. Das heißt soviel wie: wenn du was mit der so erzeugten Variable machst, nimm nicht sie selbst, sondern das Ziel der Referenz - auch bei Zuweisungen. Man kann an eine solche Variable nun keinen anderen Wert mehr zuweisen oder per Zuweisung die Referenz aufheben. Nur unset() hilft noch, um diese referenzierende Variable zu entfernen.

      dedlfix.