Comment cloner profondément un objet JavaScript ?
Je sais qu'il existe différentes fonctions basées sur des cadres tels que JSON.parse(JSON.stringify(o))
y $.extend(true, {}, o)
mais je ne veux pas utiliser un tel cadre.
Quelle est la manière la plus élégante ou la plus efficace de créer un clone profond ?
Nous nous intéressons à des cas particuliers tels que le clonage de tableaux. Ne pas briser les chaînes de prototypes, gérer l'autoréférence.
Nous ne nous soucions pas de la prise en charge de la copie d'objets DOM et autres car .cloneNode
existe pour cette raison.
Comme je veux surtout utiliser des clones profonds dans les node.js
l'utilisation des fonctionnalités ES5 du moteur V8 est acceptable.
[Editer]
Avant que quelqu'un ne le suggère, permettez-moi de préciser qu'il y a une nette différence entre créer une copie en héritant prototypiquement de l'objet et clonage il. Le premier fait des dégâts dans la chaîne de prototypes.
[Suite de la rédaction]
Après avoir lu votre réponse, j'ai fait la fâcheuse découverte que le clonage d'objets entiers est un jeu très dangereux et difficile. Prenons par exemple l'objet suivant, basé sur une fermeture
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
Existe-t-il un moyen d'écrire une fonction de clonage qui clone l'objet, qui a le même état au moment du clonage mais qui ne peut pas modifier l'état de l'objet ? o
sans écrire un parseur JS en JS.
Une telle fonction ne devrait plus être nécessaire dans le monde réel. Il s'agit d'un simple intérêt académique.