Búsqueda de sitios web

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.