--- title: Object.freeze() slug: Web/JavaScript/Reference/Global_Objects/Object/freeze translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze ---
O método Object.freeze()
congela um objeto: isto é, impede que novas propriedades sejam adicionadas a ele; impede que as propriedades existentes sejam removidas; e impede que propriedades existentes, ou sua inumerabilidade, configurabilidade, ou capacidade de escrita sejam alteradas. Em essência o objeto é efetivamente imutável. O método retorna o objeto congelado.
Object.freeze(obj)
obj
O objeto congelado.
Nada pode ser adicionado ou removido do conjunto de propriedades de um objeto congelado. Qualquer tentativa de fazê-lo irá falhar, ou silenciosamente ou através de um {{jsxref("TypeError")}} exception (mais frequentemente, mas não exclusivamente, quando em {{jsxref("Strict_mode", "strict mode", "", 1)}}).
Valores não podem ser alterados para propriedades de dados. As propriedades do Accessor (getters e setters) funcionam da mesma forma (e ainda dão a ilusão de que você está alterando o valor). Observe que valores que são objetos ainda podem ser modificados, a menos que eles também sejam congelados.
var obj = { prop: function() {}, foo: 'bar' }; // Novas propriedades podem ser adicionadas, propriedades existentes podem ser alteradas ou removidas obj.foo = 'baz'; obj.lumpy = 'woof'; delete obj.prop; // Tanto o objeto que está sendo passado, bem como o objeto retornado será congelado. // É desnecessário salvar o objeto retornado para congelar o objeto original. var o = Object.freeze(obj); o === obj; // true Object.isFrozen(obj); // === true // De agora em diante qualquer alteração irá falhar obj.foo = 'quux'; // silenciosamente não faz nada. obj.quaxxor = 'the friendly duck'; // silenciosamente não adiciona a propriedade // ...e em modo strict tais tentativas irão lançar TypeErrors function fail(){ 'use strict'; obj.foo = 'sparky'; // throws um TypeError delete obj.quaxxor; // throws um TypeError obj.sparky = 'arf'; // throws um TypeError } fail(); // As tentativas de alteração através de Object.defineProperty também irão lançar Object.defineProperty(obj, 'ohai', { value: 17 }); // throws um TypeError Object.defineProperty(obj, 'foo', { value: 'eit' }); // throws um TypeError
O exemplo a seguir mostra que valores do tipo objeto, em um objeto congelado, podem ser alterados (freeze é raso).
obj1 = { internal: {} }; Object.freeze(obj1); obj1.internal.a = 'aValue'; obj1.internal.a // 'aValue' // Para fazer um obj completamente imutável, congele cada objeto em obj. // Para fazer isso, nós usamos essa função. function deepFreeze(obj) { // Recuperar os nomes de propriedade definidos em obj var propNames = Object.getOwnPropertyNames(obj); // Congelar as propriedades antes de congelar-se propNames.forEach(function(name) { var prop = obj[name]; // Congele prop se for um objeto if (typeof prop == 'object' && prop !== null) deepFreeze(prop); }); // Congele-se (não faz nada se já estiver congelado) return Object.freeze(obj); } obj2 = { internal: {} }; deepFreeze(obj2); obj2.internal.a = 'anotherValue'; obj2.internal.a; // undefined
Em ES5, se um argumento para este método não for um objeto (um primitivo), então isso irá causar um {{jsxref("TypeError")}}. Em ES6, um argumento não-objeto vai ser tratado como se fosse um objeto comum congelado e simplesmente retornado.
> Object.freeze(1) TypeError: 1 is not an object // ES5 code > Object.freeze(1) 1 // ES6 code
Especificações | Status | Comentários |
---|---|---|
{{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}} | {{Spec2('ES5.1')}} | Definição inicial. Implementado em JavaScript 1.8.5. |
{{SpecName('ES6', '#sec-object.freeze', 'Object.freeze')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-object.freeze', 'Object.freeze')}} | {{Spec2('ESDraft')}} |
Característica | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suporte básico | {{CompatGeckoDesktop("2")}} | {{CompatChrome("6")}} | {{CompatIE("9")}} | {{CompatOpera("12")}} | {{CompatSafari("5.1")}} |
Característica | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Suporte básico | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |