aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/object/freeze/index.html
blob: 30ae4dc466ddb1d5e22463974a2852362ec0c341 (plain)
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
---
title: Object.freeze()
slug: Web/JavaScript/Reference/Global_Objects/Object/freeze
tags:
  - ECMAScript5
  - JavaScript
  - JavaScript 1.8.5
  - Method
  - Object
translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze
---
<div>{{JSRef("Global_Objects", "Object")}}</div>

<p>Метод <code><strong>Object.freeze()</strong></code> замораживает объект: это значит, что он предотвращает добавление новых свойств к объекту, удаление старых свойств из объекта и изменение существующих свойств или значения их атрибутов перечисляемости, настраиваемости и записываемости. В сущности, объект становится эффективно неизменным. Метод возвращает замороженный объект.</p>

<h2 id="Syntax">Синтаксис</h2>

<pre class="syntaxbox"><code>Object.freeze(<var>obj</var>)</code></pre>

<h3 id="Parameters">Параметры</h3>

<dl>
 <dt><code>obj</code></dt>
 <dd>Объект для заморозки.</dd>
</dl>

<h3 id="Возвращаемое_значение">Возвращаемое значение</h3>

<p>Замороженный объект</p>

<h2 id="Description">Описание</h2>

<p>К замороженному объекту нельзя добавить никаких свойств, так же как и удалить свойства из замороженного объекта. Любые попытки сделать это потерпят неудачу, либо молча, либо выбросив исключение {{jsxref("Global_Objects/TypeError", "TypeError")}} (как правило, но не обязательно, это происходит в {{jsxref("Functions_and_function_scope/Strict_mode", "строгом режиме", "", 1)}}).</p>

<p>Значения свойств-данных не могут быть изменены. Свойства-доступы (геттеры и сеттеры) работают как положено (и всё ещё создают иллюзию, что вы изменили значение). Обратите внимание, что значения, являющиеся объектами, всё ещё могут быть изменены, если только они так же не были заморожены.</p>

<h2 id="Examples">Примеры</h2>

<pre class="brush: js">var obj = {
  prop: function() {},
  foo: 'bar'
};

// Можно добавлять новые свойства, существующие свойства можно изменять или удалять
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

// Оба объекта эквивалентны, а также возвращаемый объект будет заморожен.
// Необязательно сохранять возвращаемый объект при заморозке оригинала.
var o = Object.freeze(obj);

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

// Теперь все изменения будут заканчиваться с ошибкой
obj.foo = 'quux'; // тихо ничего не делает
obj.quaxxor = 'the friendly duck'; // тихо не добавляет свойство

// ...а в строгом режиме такие попытки вызовут выброс исключения TypeError
function fail() {
  'use strict';
  obj.foo = 'sparky'; // выбросит TypeError
  delete obj.quaxxor; // выбросит TypeError
  obj.sparky = 'arf'; // выбросит TypeError
}

fail();

// Попытки внести изменения через метод Object.defineProperty также выбросят исключение
Object.defineProperty(obj, 'ohai', { value: 17 }); // выбросит TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // выбросит TypeError
</pre>

<p>Следующий пример показывает, что значения-объекты в замороженном объекте могут быть изменены (заморозка неглубокая).</p>

<pre class="brush: js">obj = {
  internal: {}
};

Object.freeze(obj);
obj.internal.a = 'значениеA';

obj.internal.a // 'значениеA'

// Чтобы сделать объект obj полностью неизменяемым, замораживаем каждый объект в объекте obj.
// Для этого воспользуемся этой функцией.
function deepFreeze(obj) {

  // Получаем имена свойств из объекта obj
  var propNames = Object.getOwnPropertyNames(obj);

  // Замораживаем свойства для заморозки самого объекта
  propNames.forEach(function(name) {
    var prop = obj[name];

    // Заморозка свойства prop, если оно объект
    if (typeof prop == 'object' &amp;&amp; prop !== null)
      deepFreeze(prop);
  });

  // Заморозить сам объект obj (ничего не произойдёт, если он уже заморожен)
  return Object.freeze(obj);
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'другоеЗначение';
obj2.internal.a; // undefined
</pre>

<h2 id="Notes">Примечания</h2>

<p>В ES5 если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение {{jsxref("Global_Objects/TypeError", "TypeError")}}. В ES2015 такой аргумент будет рассматриваться, как простой замороженный объект и метод его просто вернёт.</p>

<pre class="brush: js">&gt; Object.freeze(1)
TypeError: 1 is not an object // код ES5

&gt; Object.freeze(1)
1                             // код ES2015
</pre>

<h2 id="Specifications">Спецификации</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Спецификация</th>
   <th scope="col">Статус</th>
   <th scope="col">Комментарии</th>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td>Изначальное определение. Реализована в JavaScript 1.8.5.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES2015', '#sec-object.freeze', 'Object.freeze')}}</td>
   <td>{{Spec2('ES2015')}}</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="Browser_compatibility">Совместимость с браузерами</h2>

<div>{{Compat("javascript.builtins.Object.freeze")}}</div>

<h2 id="See_also">Смотрите также</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>