diff options
Diffstat (limited to 'files/es/web/javascript/reference/global_objects/object/freeze/index.html')
-rw-r--r-- | files/es/web/javascript/reference/global_objects/object/freeze/index.html | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/files/es/web/javascript/reference/global_objects/object/freeze/index.html b/files/es/web/javascript/reference/global_objects/object/freeze/index.html new file mode 100644 index 0000000000..890d0d07b4 --- /dev/null +++ b/files/es/web/javascript/reference/global_objects/object/freeze/index.html @@ -0,0 +1,174 @@ +--- +title: Object.freeze() +slug: Web/JavaScript/Referencia/Objetos_globales/Object/freeze +translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze +--- +<div>{{JSRef}}</div> + +<p>El método <code><strong>Object.freeze()</strong></code> <em>congela</em> un objeto, es decir: impide que se le agreguen nuevas propiedades; impide que se puedan eliminar las propiedades ya existentes; impide que dichas propiedades, o su capacidad de enumeración, configuración, o escritura, puedan ser modificadas; impide también que se pueda modificar su prototipo. El método devuelve el objeto recibido.</p> + +<div>{{EmbedInteractiveExample("pages/js/object-freeze.html")}}</div> + +<p class="hidden">El código de este ejemplo interactivo está almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, puedes clonar <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> y enviarnos un <em>pull request</em>.</p> + +<h2 id="Sintaxis">Sintaxis</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>El objeto a <em>congelar</em>.</dd> +</dl> + +<h3 id="Valor_devuelto">Valor devuelto</h3> + +<p>El mismo objeto</p> + +<h2 id="Descripción">Descripción</h2> + +<p>Nada puede ser agregado o removido de las propiedades establecidas de un objeto <em>congelado</em>. Cualquier intento de hacerlo fallará, ya sea de manera silenciosa o <em>arrojando una excepción </em>{{jsxref("TypeError")}} (más comunmente, pero no exclusivamente, en {{jsxref("Strict_mode", "strict mode", "", 1)}}).</p> + +<p>Los valores no pueden ser cambiados por propiedades de datos. Propiedades de acceso (<em>getters</em> y <em>setters</em>) funcionan igual (y aún dan la ilusión de que estas cambiando el valor). Note que los valores que son objetos aún pueden ser modificados, a menos que esten <em>congelados</em> tambien.</p> + +<p>La función retorna el mismo objeto pasado en ella, no crea una copia <em>congelada</em></p> + +<h2 id="Ejemplos">Ejemplos</h2> + +<h3 id="Congelando_Objetos">Congelando Objetos</h3> + +<pre class="brush: js">var obj = { + prop: function() {}, + foo: 'bar' +}; + +// Nuevas propiedades pueden ser agregadas, +// propiedades existentes pueden cambiar o removerse +obj.foo = 'baz'; +obj.lumpy = 'woof'; +delete obj.prop; + +// Ambos, el objeto pasado como argumento tanto como el que se regresa +// serán congelados +// Es innecesario salvar el objeto que es regresado en orden de <em>congelar</em> +// el original. +var o = Object.freeze(obj); + +assert(Object.isFrozen(obj) === true); + +// Ahora cualquier cambio fallará +obj.foo = 'quux'; // No hace nada de manera silenciosa +obj.quaxxor = 'the friendly duck'; // No agrega una nueva propiedad, de manera silenciosa + +// ...y en modo estrico tal intento arrojará TypeErrors +function fail(){ + 'use strict'; + obj.foo = 'sparky'; // arroja un TypeError + delete obj.quaxxor; // arroja un TypeError + obj.sparky = 'arf'; // arroja un TypeError +} + +fail(); + +// Los intentos utilizando Object.defineProperty tambien arrojarán una excepción... +Object.defineProperty(obj, 'ohai', { value: 17 }); // arroja un TypeError +Object.defineProperty(obj, 'foo', { value: 'eit' }); // arroja un TypeError + +// Es imposible cambiar un prototipo +// Estos ejemplos retornan un error TypeError +Object.setPrototype(obj,{x:20}) +obj.__proto__ = {x:20} +</pre> + +<p>El siguiente ejemplo muestra que los valores de objetos en un objeto congelado pueden ser mutados (la congelación es superficial).</p> + +<pre class="brush: js">obj1 = { + internal: {} +}; + +Object.freeze(obj1); +obj1.internal.a = 'aValue'; + +obj1.internal.a // 'aValue' + +// Para hacer obj completamente inmutable, congelamos cada objeto en obj. +// Para hacerlo, usamos esta función. +function deepFreeze(obj) { + + // Recuperamos el nombre de las propiedades en obj + var propNames = Object.getOwnPropertyNames(obj); + + // Congelamos las propiedades antes de congelar a obj + propNames.forEach(function(name) { + var prop = obj[name]; + + // Si la propiedad es un objeto, llamaremos a deepFreezze para que congele las propiedades de ese objeto + if (typeof prop == 'object' && prop !== null && !Object.isFrozen(prop)) + deepFreeze(prop); + }); + + // congelamos a obj + return Object.freeze(obj); +} + +obj2 = { + internal: {} +}; + +deepFreeze(obj2); +obj2.internal.a = 'anotherValue'; +obj2.internal.a; // undefined +</pre> + +<h2 id="Notas">Notas</h2> + +<p>En ES5, si el argumento pasado a este método no es un objeto (un primitivo), entonces causará un {{jsxref("TypeError")}}. En ES6, un argumento no-objeto será tratado como si fuera un objeto <em>congelado</em> cualquiera, simplemente lo regresa.</p> + +<pre class="brush: js">> Object.freeze(1) +TypeError: 1 is not an object // Código ES5 + +> Object.freeze(1) +1 // Código ES6 +</pre> + +<h2 id="Especificaciones">Especificaciones</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td>Definición inicial. Implementado en 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="Compatibilidad_de_navegadores">Compatibilidad de navegadores</h2> + +<p>{{Compat("javascript.builtins.Object.freeze")}}</p> + +<h2 id="Mira_también">Mira también</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> |