Comment cloner correctement un objet JavaScript ?

J'ai un objet, x. J'aimerais le copier en tant qu'objet y, de telle sorte que les modifications apportées à y ne modifient pas x. Je me suis rendu compte que la copie d'objets dérivés d'objets JavaScript intégrés entraîne l'ajout de propriétés supplémentaires non souhaitées. Ce n'est pas un problème, puisque je copie l'un de mes propres objets, construit de manière littérale.

Comment cloner correctement un objet JavaScript ?

De cet article : Comment copier des tableaux et des objets en Javascript par Brian Huisman :

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (var i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};
Commentaires (6)

Voici une fonction que vous pouvez utiliser.

function clone(obj) {
    if(obj == null || typeof(obj) != 'object')
        return obj;    
    var temp = new obj.constructor(); 
    for(var key in obj)
        temp[key] = clone(obj[key]);    
    return temp;
}
Commentaires (4)

S'il n'y a pas de dépendances circulaires dans votre objet, je suggère d'utiliser l'une des autres réponses ou [les méthodes de copie de jQuery][1], car elles semblent toutes très efficaces.

S'il y a des dépendances circulaires (c'est-à-dire que deux sous-objets sont liés l'un à l'autre), vous êtes dans la merde car il n'y a (d'un point de vue théorique) [aucun moyen de résoudre ce problème de manière élégante][2].

[1] : https://stackoverflow.com/questions/122102/what-is-the-most-efficent-way-to-clone-a-javascript-object/122704#122704 [2] : https://stackoverflow.com/questions/597588/how-do-you-clone-an-array-of-objects-in-javascript/597726#597726

Commentaires (1)