Object: assign
Mediante esta función, Object.assign(objDst,objOrg), se pueden copiar todas las propiedades enumerables de uno o más objetos origen a un objeto destino, devolviendo como resultado el nuevo objeto destino.
Solo copia propiedades con el atributo enumerable igual a true, o sea, aquellas que aparecen listadas por keys(objeto) o que estén definidas como enumerables Las no enumerables no son copiadas. Como resultado devuelve el objeto destino ya modificado.
Es útil por ejemplo para fusionar varios objetos en uno solo. Pero hay que tener en cuenta que es una copia digamos superficial, copia solo valores de las propiedades. Si una propiedad es un objeto, copia su valor o sea su referencia, no sus propiedades. No hace clones de un objeto en otro.
El objeto destino debe existir previamente y sus propiedades son sobreescritas por los nuevos si tienen el mismo nombre.
var persona1 = { nombre : "Jose", apellidos:"Marcos", edad: 23 }
var persona2 = {};
Object.assign(persona2, persona1);
console.log(persona2);
Ahora persona1 y persona2 contiene las mismas propiedades con los mismos valores.
Otro uso es fusionar objetos, es decir, crear un objeto que contenga las propiedades de otros.
var nombre = { nombre : "Jose", apellidos:"Marcos"};
var datos ={ edad: 23 }
var ficha = {};
Object.assign(ficha, nombre, datos);
console.log(ficha);
En este caso el objeto ficha se crea con las propiedades de nombre y datos
Fijate que ocurre cuando las propiedades almacenan objetos
var matricula = { nombre : "Jose",
apellidos:"Marcos",
materias : ['inglés','francés']
};
var copia = Object.assign({}, matricula);
console.log(copia.materias); // 'inglés','francés'
console.log(matricula.materias); // 'inglés','francés'
matricula.materias[0] = 'Alemán';
console.log(copia.materias); // 'Alemán','francés'
Al cambiar matrícula.materias ha cambiado también copia.materias ¿Porqué ha ocurrido esto? porque ambas son el mismo objeto array .
var matricula = { nombre : "Jose",
apellidos:"Marcos",
materias : ['inglés','francés']
};
var copia = Object.assign({}, matricula);
copia.materias = Object.assign([], matricula.materias);
console.log("Copia :"+copia.materias ); // 'inglés','francés'
console.log("Matrícula: "+matricula.materias); // 'inglés','francés'
matricula.materias[0] = 'Alemán';
console.log("Copia :"+copia.materias); // 'Alemán','francés'
console.log("Matrícula: "+matricula.materias); // 'Alemán','francés'
Ahora no ocurre ese efecto, ahora la propiedad copia.materias no es la misma que matricula.materia, así que podemos cambiar una sin afectar a la otra.