🥶 Object seal e freeze in JavaScript: a cosa servono e quando usarli

  


JavaScript è un linguaggio dinamico, in cui gli oggetti possono essere modificati liberamente dopo la loro creazione. Tuttavia, in alcuni scenari può essere utile o necessario limitare le modifiche a un oggetto per proteggere i dati o mantenere l'integrità di una struttura.

Per questo scopo, JavaScript mette a disposizione due metodi fondamentali:

  • Object.seal()
  • Object.freeze()

In questo articolo vedremo la differenza tra i due, come usarli correttamente, e li illustreremo con esempi pratici.

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

🔐 Object.seal(): bloccare la struttura, ma non i valori

Cos’è?

Object.seal(obj) sigilla un oggetto: impedisce l’aggiunta o la rimozione di proprietà, ma consente la modifica dei valori delle proprietà già esistenti.

Quando usarlo?

Quando vuoi proteggere la struttura dell’oggetto, assicurandoti che nessuno aggiunga o rimuova campi, ma permettendo ancora modifiche ai dati interni.

Esempio:

const user = {
  name: "Alice",
  age: 30
};

Object.seal(user);

user.age = 31;         // ✅ allowed
user.city = "London";  // ❌ won't be added
delete user.name;      // ❌ won't be deleted

console.log(user);
// Output: { name: 'Alice', age: 31 }

Come puoi vedere:

  • La proprietà age è stata aggiornata correttamente.
  • L’aggiunta di city è ignorata.
  • La cancellazione di name non ha effetto.

❄️ Object.freeze(): bloccare struttura e valori

Cos’è?

Object.freeze(obj) congela completamente un oggetto: non è possibile né aggiungere né rimuovere proprietà, né modificarne i valori.

Quando usarlo?

Quando vuoi creare un oggetto immutabile, per esempio per costanti di configurazione o per dati che non devono cambiare in nessun caso.

Esempio:

const config = {
  host: "localhost",
  port: 8080
};

Object.freeze(config);

config.port = 3000;       // ❌ won't change
config.env = "production" // ❌ won't be added
delete config.host;       // ❌ won't be deleted

console.log(config);
// Output: { host: 'localhost', port: 8080 }

🧪 Come verificare se un oggetto è sigillato o congelato?

JavaScript fornisce due metodi per controllare lo stato di un oggetto:


Object.isSealed(obj);  // true if sealed
Object.isFrozen(obj);  // true if frozen

Esempio:

const obj = {};
Object.seal(obj);

console.log(Object.isSealed(obj)); // true
console.log(Object.isFrozen(obj)); // false

🔁 Attenzione: seal e freeze sono shallow

Entrambe le tecniche agiscono solo sul primo livello dell’oggetto. Se un oggetto ha proprietà annidate (oggetti dentro oggetti), queste restano modificabili, a meno che non vengano anch'esse sigillate o congelate ricorsivamente.

Esempio:

const settings = {
  theme: {
    color: "blue"
  }
};

Object.freeze(settings);

settings.theme.color = "red"; // ✅ allowed (nested object not frozen)
console.log(settings.theme.color); // Output: "red"

Come congelare un oggetto in profondità?

Puoi usare una funzione ricorsiva:

function deepFreeze(obj) {
  Object.getOwnPropertyNames(obj).forEach(prop => {
    if (typeof obj[prop] === 'object' && obj[prop] !== null) {
      deepFreeze(obj[prop]);
    }
  });
  return Object.freeze(obj);
}

const deepSettings = {
  theme: {
    color: "blue"
  }
};

deepFreeze(deepSettings);
deepSettings.theme.color = "red"; // ❌ won't change

console.log(deepSettings.theme.color); // Output: "blue"

✅ Conclusione

Le tecniche seal e freeze sono strumenti potenti per controllare e proteggere lo stato degli oggetti JavaScript. Usali per:

  • Evitare modifiche non intenzionali
  • Rendere oggetti immutabili (con freeze)
  • Proteggere API o configurazioni
  • Migliorare la sicurezza e la stabilità del tuo codice
Metodo Aggiungere proprietà Rimuovere proprietà Modificare valori
Object.seal
Object.freeze

Ricorda: per oggetti complessi o profondi, considera l’uso di funzioni ricorsive come deepFreeze() per una protezione completa.



Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment