2012-12-18 21 views
9

Durante il caricamento della pagina sto creando due oggetti Javascript, objDemo1 e objDemo1Backup in cui quest'ultimo è semplicemente una copia esatta del primo.Sostituire un oggetto javascript con un altro oggetto

ad es.

objDemo1 { 
    sub_1 = { something: 123, somethingElse: 321 }, 
    sub_2 = { something: 456, somethingElse: 654 } 
} 

posso modificare i valori in sub_ così come aggiungere/eliminare nuovi sub_ 's, ma l'unico oggetto che sto Editing è objDemo1. vale a dire che non ho mai cambiare objDemo1Backup

Ho un pulsante di reset che se cliccato ripristinerà objDemo1 indietro a quello che era quando la pagina caricata in origine (vale a dire objDemo1 = objDemo1Backup). Questo è dove sto avendo il problema ..

Come impostare objDemo1 su objDemo1Backup?

ho provato:

objDemo1 = objDemo1Backup; 

e

objDemo1 = null; 
var objDemo1 = objDemo1Backup; 

... così come le variazioni simili, ma nulla sembra funzionare. Qualche idea?

  • Nota: Posso confermare che in corrispondenza del punto di ripristino, objDemo1Backup è esattamente lo stesso come lo era quando ho creato e objDemo1 è cambiato.
  • Il mio codice sta sicuramente colpendo la funzionalità "reset", dove ho provato il objDemo1 = objDemo1Backup ... Non riesco a capire la sintassi per sostituire l'oggetto.
+1

Suppongo che ciò che sta accadendo sia che sia "objDemo1" che "objDemo1Backup" puntino allo stesso oggetto, quando ne modifichi uno, entrambi vengono cambiati. Questo potrebbe non sembrare intuitivo, ma è il modo in cui funziona JavaScript. Google ** "javascript clone object" ** per ulteriori dettagli. – Shmiddty

+1

Stai giocando con riferimento all'oggetto, non clonandolo. Dovresti clonare il tuo oggetto invece di assegnarlo usando = – LittleSweetSeas

risposta

7

In oggetti JavaScript vengono passati per riferimento, mai per valore. Quindi:

var objDemo, objDemoBackup; 
objDemo = { 
    sub_1: "foo"; 
}; 
objDemoBackup = objDemo; 
objDemo.sub_2 = "bar"; 
console.log(objDemoBackup.sub_2); // "bar" 

Per ottenere una copia, è necessario utilizzare una funzione di copia. JavaScript non ne ha uno in modo nativo, ma qui è un'implementazione clone: How do I correctly clone a JavaScript object?

var objDemo, objDemoBackup; 
objDemo = { 
    sub_1: "foo"; 
}; 
objDemoBackup = clone(objDemo); 
objDemo.sub_2 = "bar"; 
console.log(objDemoBackup.sub_2); // undefined 
+0

Quindi se volessi reimpostare objDemo su ciò che objDemoBackup era un punto di clonazione, farei questo: 'objDemo = clone (objDemoBackup);' –

+0

Sì, devi clonarlo di nuovo o terminerai con un riferimento :) – Halcyon

+0

Roba buona, usando 'clone()' funziona. –

12

sto usando angularjs e mi c'è voluto del tempo per scoprire come copiare un oggetto ad un altro oggetto. Normalmente si otterrà un clone oggetti chiamando clone o qui in angolare copia:

var targetObj = angular.copy(sourceObj); 

Questo vi dà una nuova istanza clonato (con un nuovo riferimento) dell'oggetto sorgente. Ma una rapida occhiata nella documentazione in mostra il secondo parametro di copia:

angular.copy(sourceObj, targetObj) 

In questo modo è possibile ignorare un oggetto di destinazione con i campi e le modalità della sorgente e anche a mantenere gli oggetti target di riferimento.

+2

Esattamente quello che stavo cercando. Non sapevo che "angular.copy" potesse prendere un oggetto target. Grazie! –

+0

Non c'è alcun tag AngularJS in questa domanda. –

Problemi correlati