Come faccio a clonare correttamente un oggetto JavaScript?

Ho un oggetto, x. Vorrei copiarlo come oggetto y, in modo che le modifiche a y non modifichino x. Mi sono reso conto che copiare oggetti derivati da oggetti JavaScript incorporati comporterà proprietà extra e indesiderate. Questo non è un problema, dato che sto copiando uno dei miei oggetti costruiti letteralmente.

Come faccio a clonare correttamente un oggetto JavaScript?

Da questo articolo: Come copiare array e oggetti in Javascript di 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;
};
Commentari (6)

Ecco una funzione che potete usare.

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;
}
Commentari (4)

Se non ci sono dipendenze circolari nel tuo oggetto, suggerisco di usare una delle altre risposte o i metodi di copia di jQuery, poiché sembrano tutti abbastanza efficaci.

Se ci sono dipendenze circolari (cioè, due sotto-oggetti si collegano l'uno all'altro), sei un po' fregato perché non c'è (da una prospettiva teorica) nessun modo per risolvere questo problema in modo elegante.

Commentari (1)