2012-04-14 4 views
4
myObj = { 
    prop1: 'alpha', 
    prop2: 'beta', 
    priceUpdatedOn: new Date() 
    }; 

    myObjQuery = myObj; 
    delete myObjQuery.priceUpdatedOn; 

console.log(myObj); 
console.log(myObjQuery); 

Wenn ich das tue, die priceUpdatedOn aus irgendeinem Grunde aus myObj auch gelöscht wird. Irgendeine Idee warum?Seltsames Verhalten beim Löschen nach Objekteigenschaft Objekt Kopieren

+0

dieses Themas Versuchen: [Javascript geklonte Objekt verliert seinen Prototyp Funktionen] (http://stackoverflow.com/questions/10151216/javascript-cloned-object-looses-its-prototype-functions) – RobG

+0

Ist die eigentliche Frage * wie ein JavaScript-Objekt zu klonen? * – alex

Antwort

3

Javascript funktioniert mit Referenzen. myObjQuery und myObj sind Verweise auf dieselben Daten im Speicher. Wenn Sie die Eigenschaft von eins ändern, wird die Kopie im Speicher geändert und somit auch alle Referenzen darauf. Sie müssen clone the object statt

4

Dies liegt daran, dass myObjQuery und myObj das gleiche Objekt sind. Wenn Sie myObjQuery = myObj machen, erstellen Sie keine Kopie des Objekts selbst, sondern eine Kopie eines Verweises darauf. Sie manipulieren Objekte nie direkt in JavaScript, sondern immer durch eine Referenz.

EDIT: Klonen von Objekten in JavaScript ist nicht einfach. Die meisten Bibliotheken wie jQuery oder Ext haben eine Möglichkeit, dies zu tun. Um es manuell zu tun, funktioniert so etwas.

var clone = {}; 
for(var prop in myObj) { 
    if(myObj.hasOwnProperty(prop)) { 
     clone[prop] = myObj[prop]; 
    } 
} 

Denken Sie daran, dass es sich um eine flache Kopie handelt. Um eine tiefe Kopie zu erstellen, müssen Sie erkennen, ob die Eigenschaften selbst Objekte sind, und sie rekursiv auch klonen. Am besten, eine Bibliothek zu verwenden, die all dies für Sie erledigt. Denken Sie auch daran, dass es viele Randfälle und seltsame Dinge wie die Konstruktoreigenschaft des Objekts nicht gibt. JavaScript ist hier wirklich unordentlich.

+0

Also, wie ich das Objekt duplizieren? – Shamoon

+0

@Shamoon - Ich habe meine Antwort editiert und hinzugefügt, wie man ein Objekt in JS –

+1

@ jimw dupliziert - es gibt keinen Grund, auf eine Frage zu verweisen, die diese Frage nicht beantwortet. Die akzeptierte Antwort wird dem OP nicht viel über das Kopieren oder Klonen von Objekten erzählen. – RobG

1

Mit diesem Befehl

myObjQuery = myObj; 

Sie tun keine Kopie des Objekts erstellen, sondern nur eine Kopie der Referenz auf das Objekt. Danach zeigen sowohl myObjQuery als auch myObj immer noch auf das gleiche Objekt. Wenn Sie eine Eigenschaft dieses Objekts löschen, spiegeln beide Referenzen diese Änderung wider.