2012-12-18 6 views
9

Lors du chargement de la page, je crée deux objets Javascript, objDemo1 et objDemo1Backup où ce dernier est simplement une copie exacte du premier.Remplacer un objet javascript par un autre objet

par exemple.

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

Je peux modifier les valeurs sub_ ainsi que d'ajouter/supprimer de nouveaux sub_ « s, mais le seul objet que je suis l'édition est objDemo1. dire que je ne change objDemo1Backup

J'ai un bouton de réinitialisation lorsque vous cliquez dessus réinitialisera objDemo1 à ce qu'elle était lorsque la page chargée à l'origine (à savoir objDemo1 = objDemo1Backup). C'est là que j'ai le problème ..

Comment régler objDemo1 à objDemo1Backup?

J'ai essayé:

objDemo1 = objDemo1Backup; 

et

objDemo1 = null; 
var objDemo1 = objDemo1Backup; 

... ainsi que des variations similaires, mais rien ne semble fonctionner. Des idées?

  • Note: Je peux confirmer que le point de remise à zéro, objDemo1Backup est exactement le même que celui qu'il était quand je l'ai créé et objDemo1 a changé.
  • Mon code frappe définitivement la fonctionnalité "reset", où j'ai essayé le objDemo1 = objDemo1Backup ... Je n'arrive pas à trouver la syntaxe pour remplacer l'objet.
+1

Je vais supposer que ce qui se passe est que puisque objDemo1 et objDemo1Backup pointent sur le même objet, lorsque vous en changez un, les deux sont modifiés. Cela peut ne pas sembler intuitif, mais c'est le fonctionnement de javascript. Google ** "objet javascript clone" ** pour plus de détails. – Shmiddty

+1

Vous jouez avec une référence d'objet, pas en la clonant. Vous devriez cloner votre objet au lieu de l'assigner en utilisant = – LittleSweetSeas

Répondre

7

Dans les objets JavaScript sont transmis par référence, jamais par valeur. Donc:

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

Pour obtenir une copie, vous devez utiliser une fonction de copie. JavaScript n'a pas un mode natif mais voici une implémentation 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

Donc si je voulais remettre objDemo à ce que objDemoBackup était un point de clonage, je ferais ceci: 'objDemo = clone (objDemoBackup);' –

+0

Oui, vous devez le cloner à nouveau ou vous finirez avec une référence :) – Halcyon

+0

De bonnes choses, en utilisant 'clone()' ont fonctionné. –

12

J'utilise AngularJS et il m'a fallu un certain temps pour savoir comment copier un objet à un autre objet. Normalement, vous obtiendrez un clone des objets en appelant clone ou ici en angulaire copie:

var targetObj = angular.copy(sourceObj); 

Cela vous donne une nouvelle instance clonée (avec une nouvelle référence) de l'objet source. Mais un rapide coup d'oeil dans les documents révèle le deuxième paramètre de copie:

angular.copy(sourceObj, targetObj) 

De cette façon, vous pouvez remplacer un objet cible avec les champs et les méthodes de la source et garder aussi la cible des objets de référence.

+2

Exactement ce que je cherchais. Je ne savais pas que 'angular.copy' pouvait prendre un objet cible. Merci! –

+0

Il n'y a pas d'étiquette AngularJS dans cette question. –

Questions connexes