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 :
-
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
configurableest défini à false, la propriété ne pourra ni être supprimée ni voir son descripteur modifié (y compriswritable).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" -
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é. -
Utilisation de
constpour les variables contenant des objets :Le mot-clé
constrend 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.