Forum: PC-Programmierung Javascript: Fragen zum Klonen eines Objekts


von Nürnberger (Gast)


Lesenswert?

Bei
http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object
ist beschrieben, wie man ein JS-Objekt klont:
1
function clone(obj) {
2
    if (null == obj || "object" != typeof obj) return obj;
3
    var copy = obj.constructor();
4
        alert("copy  here2");
5
    for (var attr in obj) {
6
        alert("copy prop "+attr);
7
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
8
    }
9
    return copy;
10
}
11
12
var d1 = new Date();
13
14
/* Wait for 5 seconds. */
15
var start = (new Date()).getTime();
16
while ((new Date()).getTime() - start < 5000);
17
18
19
var d2 = clone(d1);
20
alert("d1 = " + d1.toString() + "\nd2 = " + d2.toString());
21
//copy  here2
22
//d1 = Sat Apr 05 2014 23:34:09 GMT+0000 (GMT)
23
//d2 = Sat Apr 05 2014 23:34:14 GMT+0000 (GMT)

Ich habe das ausprobiert mit Mozilla-JS und einige alerts eingefuegt,
um mehr zu sehen.
Wie vorausgesagt, unterscheiden sich die Uhrzeiten von d1 und d2 um 5 
Sekunden.
Aber ich weiss nicht warum.
Das klonen von d1 wird gemacht, NACH der 5 sek - Busy-Loop.
Damit müssten doch die Uhrzeiten gleich sein?!
Leider wird das auf der Website nicht erklärt.

Die andere Frage, warum er in die "for (var attr in obj)" nicht 
reinläuft.
Anscheinend wird nur der constructor kopiert.
Gruß

von Nürnberger (Gast)


Lesenswert?

Ok, die erste Frage scheint geklärt.
d1 wird VOR der 5sek-Busy-Loop erzeugt, und hat damit einen früheren 
Zeitpunkt. (sofern der Zeitpunkt in einer Member-Variablen gespeichert 
worden ist)
Aber was hat er dann geklont?
Laut
http://www.w3schools.com/jsref/jsref_obj_date.asp
besteht das Objekt nur aus Methoden,
und die geben immer den aktuellen Zeitpunkt zurück.

Ich halte es zwar nicht sehr sinnvoll, mit Date() das Klonen von 
Objekten erklären zu wollen, aber irgendwie interessiert mich das Stück 
Code.

von Εrnst B. (ernst)


Lesenswert?

Nürnberger schrieb:
> var copy = obj.constructor();

entspricht:
 var copy=new Date();
d.H. "copy" ist 5 Sekunden später dran.

>     for (var attr in obj) {
>         alert("copy prop "+attr);
>         if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
>     }

wird nicht durchlaufen. "Date"-Objekte haben keine kopierbaren 
Attribute.


d.H. dein Code funktioniert einfach nicht.
Schau dir an, wie underscore.js, jQuery & co das lösen.

von Nürnberger (Gast)


Lesenswert?

> d.H. dein Code funktioniert einfach nicht.

Wie? "mein" Code??
Bitte genau lesen:
War genau beschrieben, woher das Beispiel stammt!
http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.