¿Cómo puedo clonar correctamente un objeto JavaScript?

Tengo un objeto, x. Me gustaría copiarlo como objeto y, de forma que los cambios en y no modifiquen x. Me he dado cuenta de que copiar objetos derivados de objetos incorporados de JavaScript dará lugar a propiedades extra no deseadas. Esto no es un problema, ya que estoy copiando uno de mis propios objetos construidos literalmente.

¿Cómo puedo clonar correctamente un objeto JavaScript?

De este artículo: Cómo copiar arrays y objetos en Javascript por 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;
};
Comentarios (6)

Esta es una función que puedes utilizar.

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

Si no hay dependencias circulares en su objeto, sugiero usar una de las otras respuestas o los métodos de copia de jQuery, ya que todos parecen bastante efectivos.

Si hay dependencias circulares (es decir, dos subobjetos se enlazan entre sí), estás un poco jodido ya que no hay (desde una perspectiva teórica) ninguna manera de resolver este problema elegantemente.

Comentarios (1)