Sobes.tech
Middle

Comment rendre une propriété d'objet immuable?

sobes.tech IA

Réponse de l'IA

Il est possible de rendre une propriété d'un objet immuable de plusieurs manières :

  1. Utilisation de Object.defineProperty() :

    Cette méthode permet de définir ou de modifier les propriétés d'un objet avec un contrôle plus granulaire. Pour créer une propriété immuable, il faut définir le descripteur de la propriété avec writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Valeur immuable',
      writable: false, // Rend la propriété immuable
      enumerable: true, // La propriété sera visible lors de l'itération
      configurable: true // La propriété pourra être supprimée ou modifier son descripteur
    });
    
    // La tentative de changer la valeur sera ignorée en mode non strict
    // et provoquera une erreur TypeError en mode strict
    obj.myProperty = 'Nouvelle valeur';
    console.log(obj.myProperty); // Affichera "Valeur immuable"
    

    Si configurable est défini à false, la propriété ne pourra ni être supprimée ni voir son descripteur modifié (y compris writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Inchangeable et non supprimable facilement',
      writable: false,
      enumerable: true,
      configurable: false // Rend le descripteur de la propriété immuable
    });
    
    // Tentative de changer la valeur
    obj2.myProperty = 'Nouvelle valeur';
    console.log(obj2.myProperty); // Affichera "Inchangeable et non supprimable"
    
    // Tentative de supprimer la propriété
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Affichera "Inchangeable et non supprimable"
    
  2. Utilisation de Object.freeze() :

    Cette méthode "gèle" l'objet. Cela signifie qu'il n'est pas possible d'ajouter de nouvelles propriétés, de supprimer celles existantes, de modifier les valeurs des propriétés existantes (y compris leur énumérabilité et leur configurabilité), ni de modifier le prototype de l'objet.

    const obj = {
      myProperty: 'Valeur immuable'
    };
    
    Object.freeze(obj);
    
    // Tentative de changer la valeur
    obj.myProperty = 'Nouvelle valeur';
    console.log(obj.myProperty); // Affichera "Valeur immuable"
    
    // Tentative d'ajouter une nouvelle propriété
    obj.newProperty = 'Nouveau';
    console.log(obj.newProperty); // Affichera undefined
    
    // Tentative de supprimer la propriété
    delete obj.myProperty;
    console.log(obj.myProperty); // Affichera "Valeur immuable"
    

    Il est important de noter que Object.freeze() est superficiel. Si une propriété de l'objet est un autre objet, cet objet interne ne sera pas gelé.

  3. Utilisation de const pour les variables contenant des objets :

    Le mot-clé const rend la référence à l'objet immuable, mais pas l'objet lui-même. Vous ne pourrez pas réaffecter la variable à un autre objet, mais vous pourrez modifier les propriétés de l'objet.

    const obj = {
      myProperty: 'Valeur initiale'
    };
    
    // La valeur de la propriété peut être modifiée
    obj.myProperty = 'Nouvelle valeur';
    console.log(obj.myProperty); // Affichera "Nouvelle valeur"
    
    // La variable ne peut pas être réaffectée
    // obj = { autrePropriete: 'Autre' }; // Causant une erreur de type
    

Comparaison des méthodes :

Méthode Qu'est-ce qui devient immuable ? Niveau d'immuabilité
Object.defineProperty() Une propriété spécifique Définie par le descripteur
Object.freeze() Tout l'objet Superficiel
const La référence à l'objet Variable

Le choix de la méthode dépend de la granularité souhaitée pour l'immuabilité. Pour une seule propriété, Object.defineProperty(), pour tout l'objet, Object.freeze(). Pour empêcher la réaffectation de la référence, on utilise const.