diff options
Diffstat (limited to 'files/pt-br/web/javascript/reference/global_objects/object/freeze')
| -rw-r--r-- | files/pt-br/web/javascript/reference/global_objects/object/freeze/index.html | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/files/pt-br/web/javascript/reference/global_objects/object/freeze/index.html b/files/pt-br/web/javascript/reference/global_objects/object/freeze/index.html new file mode 100644 index 0000000000..b705441dee --- /dev/null +++ b/files/pt-br/web/javascript/reference/global_objects/object/freeze/index.html @@ -0,0 +1,205 @@ +--- +title: Object.freeze() +slug: Web/JavaScript/Reference/Global_Objects/Object/freeze +translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze +--- +<div>{{JSRef}}</div> + +<p>O método <code><strong>Object.freeze()</strong></code> 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.</p> + +<h2 id="Sintaxe">Sintaxe</h2> + +<pre class="syntaxbox"><code>Object.freeze(<var>obj</var>)</code></pre> + +<h3 id="Parâmetros">Parâmetros</h3> + +<dl> + <dt><code>obj</code></dt> + <dd>O objeto a ser congelado.</dd> +</dl> + +<h3 id="Valor_de_retorno">Valor de retorno</h3> + +<p>O objeto congelado.</p> + +<h2 id="Descrição">Descrição</h2> + +<p>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)}}).</p> + +<p>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.</p> + +<h2 id="Exemplos">Exemplos</h2> + +<pre class="brush: js">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 +</pre> + +<p>O exemplo a seguir mostra que valores do tipo objeto, em um objeto congelado, podem ser alterados (freeze é raso).</p> + +<pre class="brush: js">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 +</pre> + +<h2 id="Notas">Notas</h2> + +<p>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.</p> + +<pre class="brush: js">> Object.freeze(1) +TypeError: 1 is not an object // ES5 code + +> Object.freeze(1) +1 // ES6 code +</pre> + +<h2 id="Especificações">Especificações</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Especificações</th> + <th scope="col">Status</th> + <th scope="col">Comentários</th> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td>Definição inicial. Implementado em JavaScript 1.8.5.</td> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-object.freeze', 'Object.freeze')}}</td> + <td>{{Spec2('ES6')}}</td> + <td> </td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-object.freeze', 'Object.freeze')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="Compatibilidade_de_navegadores">Compatibilidade de navegadores</h2> + +<div>{{CompatibilityTable}}</div> + +<div id="compat-desktop"> +<table class="compat-table"> + <tbody> + <tr> + <th>Característica</th> + <th>Firefox (Gecko)</th> + <th>Chrome</th> + <th>Internet Explorer</th> + <th>Opera</th> + <th>Safari</th> + </tr> + <tr> + <td>Suporte básico</td> + <td>{{CompatGeckoDesktop("2")}}</td> + <td>{{CompatChrome("6")}}</td> + <td>{{CompatIE("9")}}</td> + <td>{{CompatOpera("12")}}</td> + <td>{{CompatSafari("5.1")}}</td> + </tr> + </tbody> +</table> +</div> + +<div id="compat-mobile"> +<table class="compat-table"> + <tbody> + <tr> + <th>Característica</th> + <th>Firefox Mobile (Gecko)</th> + <th>Android</th> + <th>IE Mobile</th> + <th>Opera Mobile</th> + <th>Safari Mobile</th> + </tr> + <tr> + <td>Suporte básico</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + </tr> + </tbody> +</table> +</div> + +<h2 id="Ver_também">Ver também</h2> + +<ul> + <li>{{jsxref("Object.isFrozen()")}}</li> + <li>{{jsxref("Object.preventExtensions()")}}</li> + <li>{{jsxref("Object.isExtensible()")}}</li> + <li>{{jsxref("Object.seal()")}}</li> + <li>{{jsxref("Object.isSealed()")}}</li> +</ul> |
