Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekt-Klon statt Referenz

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekt-Klon statt Referenz

    Tach, folgender Code funktioniert nicht, wie er auf den ersten Blick zu arbeiten scheint:

    Code:
    function foo (preset)
      {
      var out = preset;
      out.a = 5;
      }
    
    
    var inp = { test: 'test'};
    
    console.log (inp);  // {test: 'test'}
    
    outp = foo (inp);
    
    console.log (inp);  // {test: 'test' , a: 5}
    var out = preset; kopiert hier die gesamte Instanz, statt nur die Werte und ändert damit auch das Ausgangsobjekt bei jeder Operation auf die neue Variable.

    Mein aktueller "Workaround" sieht so aus (jQuery):

    Code:
    function foo (preset)
      {
      var out = jQuery.extend ({} , preset);
      out.a = 5;
      }
    Der hat allerdings einen Schönheitsfehler: extend() schmeißt alle Properties aus dem Objekt, die auf "undefined" gesetzt sind. Im Normalfall vertretbar, nur nicht, wenn man die Namen der Objektproperties bspw. per Schleife auswerten will.

    Nun die Frage:
    Gibt es eine native JS-Variante, um einen Objektklon mit allen seinen Properties zu erzeugen?

    Danke an alle Javascript-Gurus.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

  • #2
    In Prototype gibts eine ähnliche funktion, wie bei jQuery. Hier sollten allerdings auch undefined Werte kopiert werden.

    PHP-Code:
    Object.extend = function(destinationsource) {
      for (var 
    property in source)
        
    destination[property] = source[property];
      return 
    destination;
    }; 

    Kommentar


    • #3
      Stimmt schon, das geht natürlich auch. Hatte gehofft, das geht noch etwas "freakiger".
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Bei näherer Betrachtung gefällt mir die Lösung doch ganz gut. Danke.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Zitat von nikosch Beitrag anzeigen
          var out = preset; kopiert hier die gesamte Instanz, statt nur die Werte und ändert damit auch das Ausgangsobjekt bei jeder Operation auf die neue Variable.
          Objekte werden in JavaScript immer per Referenz übergeben.
          Und alles ausser den primitiven Datentypen ist ein Objekt.
          [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

          Kommentar


          • #6
            Objekte werden in JavaScript immer per Referenz übergeben.
            Und alles ausser den primitiven Datentypen ist ein Objekt.
            Ist mir ja bewußt. Ich wurde nur schmerzlich daran erinnert, dass dies dann auch für das Feedback gilt. Im Nachhinein ja logisch, aber da in JS so gut wie alles ein Objekt ist, ist es schwer überhaupt mit Parametern zu arbeiten, ohne dass das einen Seiteneffekt auf den aufrufenden Kontext hat:

            PHP-Code:
            function foo (preset)
              {
              var 
            out preset;
              
            out.foo 42;

              return 
            out;
              }

            var 
            bar = {my1}:
            var 
            baz foo (bar);

            // auch bar ist jetzt foo-o-i-siert 
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Evtl schneller:
              PHP-Code:
              function clone (obj) {
                
              // isArray (evtl die ecma5 isArray-Function mappen)
                
              if(!!(obj && obj.concat && obj.unshift && !obj.callee))
                  return 
              obj.slice(0)
                  
              // ansonsten iterieren und kopieren

              I like cooking my family and my pets.
              Use commas. Don't be a psycho.
              [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

              Kommentar

              Lädt...
              X