[javascript] Alterar y asignar objeto sin efectos secundarios


2 Answers

Este es un caso de libro de texto para una función de constructor :

var myArray = [];

function myElement(id, value){
    this.id = id
    this.value = value
}

myArray[0] = new myElement(0,1)
myArray[1] = new myElement(2,3)
// or myArray.push(new myElement(1, 1))
Question

Actualmente tengo el siguiente código:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id = 0;
myElement.value = 1;
myArray[0] = myElement;

myElement.id = 2;
myElement.value = 3;
myArray[1] = myElement;

El problema es que cuando cambio el valor de id y value para mi segundo elemento, los valores también cambian en el primer elemento. ¿Hay alguna manera de seguir añadiendo nuevos elementos sin que cambie el valor de los valores previamente insertados en la matriz?




Eso es porque los valores de los objetos se pasan por referencia. Puedes clonar el objeto así:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id =0;
myElement.value=1;
myArray[0] = myElement;

var obj = {};
obj = clone(myElement);
obj.id = 2;
obj.value = 3; 

myArray[1] = obj;

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;
}    

console.log(myArray[0]);
console.log(myArray[1]);

Resultado:

 - id: 0
 - value: 1
 - id: 2
 - value: 3



Los objetos se pasan por referencia. Para crear un nuevo objeto, sigo este enfoque.

//Template code for object creation.
function myElement(id, value) {
    this.id = id;
    this.value = value;
}
var myArray = [];

//instantiate myEle
var myEle = new myElement(0, 0);
//store myEle
myArray[0] = myEle;

//Now create a new object & store it
myEle = new myElement(0, 1);
myArray[1] = myEle;



Related



Tags

javascript javascript