Sobes.tech
Middle

Comment peut-on interdire la modification d'un objet en JavaScript?

sobes.tech IA

Réponse de l'IA

Vous pouvez utiliser les méthodes intégrées de Object :

  1. Object.preventExtensions(obj) : Interdit d'ajouter de nouvelles propriétés à l'objet, mais permet de modifier et de supprimer les propriétés existantes.
  2. Object.seal(obj) : Interdit d'ajouter et de supprimer des propriétés, mais permet de modifier les propriétés existantes. En fait, c'est preventExtensions + interdiction de suppression.
  3. Object.freeze(obj) : Interdit d'ajouter, de supprimer et de modifier des propriétés. Rend l'objet immuable en profondeur. C'est seal + interdiction de modifier les propriétés existantes.

Exemple d'utilisation :

// Objet initial
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // N'aura pas d'effet en mode strict, sera ignoré en mode non strict.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Fonctionne
delete mySealedObject.name; // Ne fonctionne pas en mode strict.
mySealedObject.city = 'Paris'; // Ne fonctionne pas en mode strict.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Ne fonctionne pas en mode strict.
delete myFrozenObject.name; // Ne fonctionne pas en mode strict.
myFrozenObject.city = 'New York'; // Ne fonctionne pas en mode strict.

Il est important de se rappeler que Object.freeze est superficiel. Si l'objet contient des références à d'autres objets, ces objets imbriqués pourront être modifiés s'ils ne sont pas eux-mêmes gelés. Pour un gel en profondeur, une fonction récursive est nécessaire.

// Exemple de gel en profondeur
function deepFreeze(obj) {
  Object.freeze(obj); // Gèle l'objet actuel

  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const prop = obj[key];

      // Si la propriété est un objet (et pas null), le geler récursivement
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

let nestedObject = {
  name: 'Deep',
  details: {
    level: 1
  }
};

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Ne fonctionnera pas en mode strict.

Tableau comparatif :

Méthode Ajout de propriétés Suppression de propriétés Modification de propriétés
Object.preventExtensions() Non Oui Oui
Object.seal() Non Non Oui
Object.freeze() Non Non Non