
Protéger et sécuriser les objets en JavaScript
Publié le
Lors du développement en JavaScript, il est parfois nécessaire de restreindre les modifications sur des objets. Les méthodes Object.freeze()
et Object.seal()
offrent des manières différentes de protéger un objet. Comprendre ces méthodes et leurs limitations est crucial pour écrire un code robuste et éviter les effets de bords non désirés.
Object.freeze()
: rendre un objet immuable
La méthode Object.freeze()
permet de geler un objet, c’est-à-dire de rendre ses propriétés immuables et de bloquer toute modification.
const obj = { nom: "Alice", age: 25 };
Object.freeze(obj);
obj.nom = "Bob"; // Ignoré ou erreur en mode strict
obj.nouvellePropriete = "valeur"; // Ignoré
console.log(obj.nom); // Affiche "Alice"
Que signifie geler un objet ?
- Interdiction de modifier : Les propriétés existantes ne peuvent pas être modifiées, ajoutées ou supprimées.
- Immuabilité superficielle : Seules les propriétés directes de l’objet sont gelées. Si une propriété est un objet, elle peut toujours être modifiée.
Exemple de gel superficiel
const obj = { details: { nom: "Alice" } };
Object.freeze(obj);
obj.details.nom = "Bob"; // Modifiable, car obj.details n'est pas gelé
console.log(obj.details.nom); // Affiche "Bob"
Vérifier si un objet est gelé
La méthode Object.isFrozen()
permet de déterminer si un objet est gelé :
const obj = { nom: "Alice" };
console.log(Object.isFrozen(obj)); // Affiche false
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // Affiche true
Object.seal()
: restreindre les modifications sans bloquer les mises à jour
La méthode Object.seal()
empêche l’ajout ou la suppression de propriétés, mais permet encore de modifier les valeurs des propriétés existantes.
const obj = { nom: "Alice" };
Object.seal(obj);
obj.nom = "Bob"; // Modifiable
obj.nouvellePropriete = "valeur"; // Ignoré
delete obj.nom; // Ignoré
console.log(obj.nom); // Affiche "Bob"
Vérifier si un objet est scellé
Pour savoir si un objet est scellé, utilisez Object.isSealed()
:
const obj = { nom: "Alice" };
console.log(Object.isSealed(obj)); // Affiche false
Object.seal(obj);
console.log(Object.isSealed(obj)); // Affiche true
Différences entre Object.freeze()
et Object.seal()
- Object.freeze(): Les propriétés sont totalement immuables. Aucune modification n’est permise.
- Object.seal(): Les propriétés existantes sont modifiables, mais aucune nouvelle propriété ne peut être ajoutée ou supprimée.
Comparaison
- Modification d'une valeur existante :
Object.freeze()
: NonObject.seal()
: Oui
- Ajout de nouvelles propriétés :
Object.freeze()
: NonObject.seal()
: Non
- Suppression de propriétés existantes :
Object.freeze()
: NonObject.seal()
: Non
Cas d’utilisation
- Object.freeze(): Utile pour garantir l’immutabilité des configurations ou des constantes partagées.
- Object.seal(): Idéal pour restreindre les modifications structurelles tout en permettant des mises à jour des valeurs.
Conclusion
Les méthodes Object.freeze()
et Object.seal()
permettent de mieux contrôler la mutabilité des objets en JavaScript. Comprendre leurs différences et leurs limitations, notamment la notion de gel ou de scellage superficiel, est essentiel pour les utiliser efficacement dans vos projets.