"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Mutabilidad de objetos en Javascript

Mutabilidad de objetos en Javascript

Publicado el 2024-08-19
Navegar:624

Object Mutability in Javascript

Mutabilidad de objetos

La mutabilidad es la capacidad de cambiar un valor. Un valor mutable se puede cambiar y un valor inmutable no se puede cambiar. Un error común es pensar que la palabra clave "const" hace que una variable sea inmutable.

constante

En realidad, "const" solo evita la reasignación. Para los tipos que no son de objeto, los valores solo se pueden cambiar mediante reasignación, por lo que declararlos con "const" en realidad los hace inmutables. Considere, por ejemplo, el siguiente código:

const num = 5;
num = 7; // illegal reassignment of const variable

No hay forma de cambiar el valor de num en este código. Tenga en cuenta que el uso de o -- todavía se considera reasignaciones, y eso se indica en el mensaje de error si intentamos usarlos en una variable declarada con const.

const num = 5;
num  ;//illegal reassignment of constant

El error resultante es:

Uncaught TypeError: Assignment to constant variable.

los objetos constantes pueden ser mutables

Los objetos son fundamentalmente diferentes con respecto a la mutabilidad en que sus valores pueden cambiar sin reasignación de la variable. Tenga en cuenta que "const" no impide la reasignación de propiedades. Sólo se impide la reasignación del nombre de la variable.

const obj = {num: 5};
obj.num = 7; //legal
obj = {num: 7}; //illegal reassignment 

Los objetos también pueden tener métodos que cambian los valores internos.

const obj = {
    num: 5,
    increment(){
        this.num  ;
    }
}
obj.increment();
console.log(obj.num); //6

Hacer que un objeto sea inmutable

Es posible hacer que un objeto sea realmente inmutable declarándolo con "const" y usando Object.freeze().

const obj = {num: 5};
Object.freeze(obj);
obj.num = 7; // doesn't change
console.log(obj.num);// still 5

Tenga en cuenta que si usamos el modo estricto, el intento de cambiar el valor numérico en realidad provocaría un bloqueo con el siguiente mensaje de error:

Cannot assign to read only property 'num'

El uso de Object.freeze() sin "const" ya es suficiente para hacer que este objeto sea inmutable. Sin embargo, no hace que el nombre de la variable sea inmutable.

let obj = {num: 5};
Object.freeze(obj);
obj = {num: 5}; // new object with old name
obj.num = 7; // changes successfully
console.log(obj.num);// 7

Lo que sucede en esta versión del código es que obj se reasigna. Freeze() se aplicó al objeto anterior que compartía el mismo nombre, pero el nuevo objeto nunca se congeló, por lo que es mutable.

Sellar objetos

Hay ocasiones en las que es posible que desees permitir que los valores de un objeto cambien, pero no deseas permitir que se agreguen o eliminen propiedades. Esto se puede lograr usando Object.seal().

let obj = {num: 5};
Object.seal(obj);
obj.num = 7; // changes
console.log(obj.num);// 7
obj.newValue = 42; //cannot add new property to sealed object
console.log(obj.newValue);//undefined
delete obj.num; //cannot delete property from sealed object
console.log(obj.num);// still exists and is 7

Control granular

La congelación y el sellado se aplican a todo el objeto. Si desea que propiedades específicas sean inmutables, puede hacerlo usando defineProperty() o defineProperties(). La elección entre estos dos depende de si desea afectar una sola propiedad o varias propiedades.

const obj = {};
Object.defineProperty(obj, 'num',{
    value: 5,
    writable: false,
    configurable: false
});
obj.num = 7; // Cannot change value because writable is false
delete obj.num; // Cannot delete because configurable is false
console.log(obj.num);//Still exists and is 5

En este ejemplo se define una nueva propiedad, pero defineProperty() también se puede utilizar en una propiedad existente. Tenga en cuenta que si "configurable" se estableció previamente en falso, no se puede cambiar a verdadero, pero si originalmente era verdadero, se puede establecer en falso, ya que este cambio cuenta como un tipo de configuración.

Conclusión

En la mayoría de los casos, no será necesario garantizar que un objeto sea inmutable. Cuando surge tal necesidad, generalmente es suficiente congelar el objeto, pero tenemos opciones adicionales para controles más precisos si surgen tales necesidades.

Declaración de liberación Este artículo se reproduce en: https://dev.to/chooking/object-mutability-in-javascript-1nk4?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3