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
|
---
title: Object.seal()
slug: Web/JavaScript/Reference/Global_Objects/Object/seal
tags:
- ECMAScript5
- JavaScript
- Об'єкт
- метод
translation_of: Web/JavaScript/Reference/Global_Objects/Object/seal
---
<div>{{JSRef}}</div>
<p>Метод <code><strong>Object.seal()</strong></code> запечатує об'єкт, запобігаючи створенню нових властивостей та відмічаючи усі існуючі властивості як недоступні для налаштування. Значення існуючих властивостей можна і надалі змінювати, якщо вони доступні для запису.</p>
<div>{{EmbedInteractiveExample("pages/js/object-prototype-seal.html")}}</div>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox">Object.seal(<var>obj</var>)</pre>
<h3 id="Параметри">Параметри</h3>
<dl>
<dt><code><var>obj</var></code></dt>
<dd>Об'єкт, який має бути запечатаний.</dd>
</dl>
<h3 id="Повертає">Повертає</h3>
<p>Об'єкт, який запечатується.</p>
<h2 id="Опис">Опис</h2>
<p>За замовчуванням, об'єкти є {{jsxref("Object.isExtensible()", "розширюваними", "", 1)}} (до них можна додати нові властивості). Запечатування об'єкту запобігає створенню нових властивостей і робить усі існуючі властивосні недоступними для налаштування. Це робить набір властивостей об'єкта зафіксованим і незмінним. Перетворення всіх властивостей на недоступні для налаштування також запобігає зміні властивостей-значень на властивості-аксесори, та навпаки, але не запобігає зміні значеннь властивостей. Спроби додати чи видалити властивість з запечатаного об'єкта, або перетворити властивість-значення на властивість-аксесор, не спрацюють, або непомітно, або з викиданням {{jsxref("TypeError")}} (найчастіше, але не виключно, у {{jsxref("Strict_mode", "строгому режимі", "", 1)}})</p>
<p>Ланцюг прототипів залишається незмінним. Проте, властивість {{jsxref("Object.proto", "__proto__")}} {{deprecated_inline}} також запечатується.</p>
<h2 id="Приклади">Приклади</h2>
<pre class="brush: js">var obj = {
prop: function() {},
foo: 'му'
};
// Нові властивості можуть бути додані, існуючі властивості
// можуть бути змінені або видалені.
obj.foo = 'мяв';
obj.lumpy = 'ква';
delete obj.prop;
var o = Object.seal(obj);
o === obj; // true
Object.isSealed(obj); // === true
// На запечатаному об'єкті можна змінювати значення властивостей
obj.foo = 'кря';
// Але не можна перетворити властивості-значення на властивості-аксесори,
// і навпаки.
Object.defineProperty(obj, 'foo', {
get: function() { return 'g'; }
}); // викидає TypeError
// Тепер будь-які спроби змін в об'єкті, окрім змін властивостей,
// не працюватимуть.
obj.quaxxor = 'весела качка';
// непомітно не додасть властивість
delete obj.foo;
// непомітно не видалить властивість
// ...а у строгому режимі такі спроби
// викидатимуть помилки TypeError.
function fail() {
'use strict';
delete obj.foo; // викидає TypeError
obj.sparky = 'гав'; // викидає TypeError
}
fail();
// Спроби додавання властивостей за допомогою
// Object.defineProperty також викидатимуть помилки.
Object.defineProperty(obj, 'ohai', {
value: 17
}); // викидає TypeError
Object.defineProperty(obj, 'foo', {
value: 'рох'
}); // змінює значення існуючої властивості
</pre>
<h2 id="Примітки">Примітки</h2>
<p>У ES5, якщо аргументом цього методу є не об'єкт (примітив), це спричинить {{jsxref("TypeError")}}. У ES2015 аргумент, що не є об'єктом, сприйматиметься як звичайний запечатаний об'єкт, і буде просто повернений.</p>
<pre class="brush: js">Object.seal(1);
// TypeError: 1 is not an object (код ES5)
Object.seal(1);
// 1 (код ES2015)
</pre>
<h3 id="Порівняння_з_Object.freeze">Порівняння з <code>Object.freeze()</code></h3>
<p>Існуючі властивості об'єктів, заморожених методом {{jsxref("Object.freeze()")}}, стають незмінними. Властивості об'єкта, запечатаного методом <code>Object.seal()</code>, надалі можуть бути зміненні.</p>
<h2 id="Специфікації">Специфікації</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Специфікації</th>
<th scope="col">Статус</th>
<th scope="col">Коментар</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ES5.1', '#sec-15.2.3.8', 'Object.seal')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Початкове визначення. Реалізоване у JavaScript 1.8.5.</td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-object.seal', 'Object.seal')}}</td>
<td>{{Spec2('ES6')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-object.seal', 'Object.seal')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
<p>{{Compat("javascript.builtins.Object.seal")}}</p>
<h2 id="Див._також">Див. також</h2>
<ul>
<li>{{jsxref("Object.isSealed()")}}</li>
<li>{{jsxref("Object.preventExtensions()")}}</li>
<li>{{jsxref("Object.isExtensible()")}}</li>
<li>{{jsxref("Object.freeze()")}}</li>
<li>{{jsxref("Object.isFrozen()")}}</li>
</ul>
|