1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
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>
|