ecmascript 6 - Object.Freeze Javascript
¿Cómo puedo aplicar Object.Freeze solo a un objeto?
Aquí está el ejemplo a continuación donde creo a, replico a en b, congelo el b, y trato de reasignar un valor a a. Pero ya no es posible. ¿Por qué? ¿Cómo hago freeze en solo un objeto?
¡Gracias!
let a = { "teste" : [1,2,3] }
// I want 'b' freezed
const b = a;
Object.freeze(b);
a.teste = [4,5,6]
console.log(a)Respuesta #1
Creo que estás malinterpretando el concepto de referencias en JavaScript. Los objetos se referencian en JavaScript, así que cuando haces
const b = a;
básicamente estás asignando a b un valor de la referencia a, para que tu código funcione, y en realidad "replicar" como intentas, necesitas clonar el objeto, no pasar una referencia.
Puedes usar Object.assign({}, ...) para clonar un objeto en uno nuevo. (nota que no es una clonación profunda, pero debería servirte para empezar)
let a = { "teste" : [1,2,3] }
// I want 'b' freezed
const b = Object.assign({}, a);
Object.freeze(b);
a.teste = [4,5,6]
console.log(a)Respuesta #2
Los objetos en Javascript se pasan por referencia, así que en tu ejemplo, las variables a y b se refieren al mismo objeto. Object.freeze funciona sobre el objeto en sí, no sobre la referencia, por lo que no hay diferencia si te refieres a él usando a o b. Esto es lo mismo que si simplemente hubieras establecido una propiedad:
let a = { "test" : [1,2,3] }
const b = a;
b.test = [4,5,6]
console.log(a)
Si quieres congelar o modificar b sin afectar a a, necesitarás clonarlo primero. Una forma de hacer esto es usando Object.assign:
let a = { "test" : [1,2,3] }
const b = Object.assign({}, a);
Object.freeze(b);
a.test = [4,5,6]
console.log(a)
Esto funciona copiando todas las propiedades de a a un objeto vacío, y luego asignando eso a b.
