Questa traduzione è incompleta. Collabora alla traduzione di questo articolo dall’originale in lingua inglese.

Il metodo Object.freeze() congela un oggetto: ne previene l'aggiunta, la modifica e la rimozione di proprietà, inclusa la loro enumerabilità, configurabilità e accessibilità. In sostanza, l'oggetto è reso effettivamente immutabile. Il metodo restituisce l'oggetto che è stato così congelato.

Sintassi

Object.freeze(obj)

Parametri

obj
L'oggetto da congelare.

Valore di ritorno

L'oggetto congelato.

Descrizione

Nulla può essere aggiunto o rimosso dall'insieme delle proprietà di un oggetto congelato. Qualsiasi tentativo di fare ciò fallirebbe, o silenziosamente o attraverso il ritorno di un errore TypeError (più frequentemente, ma non necessariamente, quest'ultimo scenario accadrebbe in strict mode).

I valori delle proprietà non possono essere cambiati, anche quando di tratta di setters e getters. Da notare che se un oggetto costituisce il valore di una proprietà, esso può essere ancora modificato senza problemi, a meno che anch'esso non sia stato congelato.

Esempi

var obj = {
  prop: function() {},
  foo: 'bar'
};

// Nuove proprietà possono essere aggiunte, proprietà già esistenti possono 
// essere modificate o rimosse
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;


// Sia l'oggetto che viene passato che quello restituito verranno congelati.
// No serve salvare l'oggetto restituito per congelare l'originale
var o = Object.freeze(obj);

o === obj; // true
Object.isFrozen(obj); // === true

// Adesso qualsiasi cambiamento fallirà
obj.foo = 'quux'; // silenziosamente, non succede niente
obj.quaxxor = 'the friendly duck'; // silenziosamente, non aggiungerà alcuna proprietò


// ...e nella modalità strict questi tentativi di modifica faranno lanciare TypeErrors
function fail(){
  'use strict';
  obj.foo = 'sparky'; // throws a TypeError
  delete obj.quaxxor; // throws a TypeError
  obj.sparky = 'arf'; // throws a TypeError
}

fail();


// Tentare di cambiare attraverso Object.defineProperty farà anche lanciare un TypeError
Object.defineProperty(obj, 'ohai', { value: 17 }); // throws a TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // throws a TypeError

Il seguente esempio mostra come oggetti che sono valori di proprietà possono essere mutati(il congelamento si ferma ad un solo livello di profondità).

obj1 = {
  internal: {}
};

Object.freeze(obj1);
obj1.internal.a = 'aValue';

obj1.internal.a // 'aValue'


// Per fare un oggetto totalmente non modificabile, congela ciascun oggetto in obj.
// Per farlo noi usiamo questa funzione.
function deepFreeze(obj) {

  // Prende tutti i nomi delle proprietà deginite in obj
  var propNames = Object.getOwnPropertyNames(obj);

  // Congela tutte le proprietà prima di congelare obj
  propNames.forEach(function(name) {
    var prop = obj[name];

    // Congela prop se esso è un oggetto
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });

  // Congela se stesso (niente operazione se esso è già congelato)
  return Object.freeze(obj);
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined

Note

In ES5, se l'argomento di questo metodo non è un'oggetto, allora verrà ritornato un errore TypeError. In ES2015, un argomento che non è un oggetto verrà trattato come se fosse un normale oggetto già congelato, e verrà perciò semplicemente ritornato.

> Object.freeze(1)
TypeError: 1 is not an object // ES5 code

> Object.freeze(1)
1                             // ES2015 code

Specifiche

Specifica Stato Commento
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard Commento iniziale. Implementato in JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.freeze' in that specification.
Draft  

Compatibilità con i browser

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Funzionalità Firefox (Gecko) Chrome Internet Explorer Opera Safari
Funzionalità di base 4.0 (2) 6 9 12 5.1
Funzionalità Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
Funzionalità di base ? ? ? ? ?

Guarda anche

Tag del documento e collaboratori

Hanno collaborato alla realizzazione di questa pagina: kdex, Cesarec88, DeadManPoe
Ultima modifica di: kdex,