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
|
---
title: Object.preventExtensions()
slug: Web/JavaScript/Reference/Global_Objects/Object/preventExtensions
tags:
- ECMAScript5
- JavaScript
- Object
- метод
translation_of: Web/JavaScript/Reference/Global_Objects/Object/preventExtensions
---
<div>{{JSRef}}</div>
<p><code><strong>Object.preventExtensions()</strong></code> метод позбавляє можливості додавати нові властивості до об'єкта (тобто, розширювати об'єкт у подальшому).</p>
<div>{{EmbedInteractiveExample("pages/js/object-preventextensions.html")}}</div>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox"><code>Object.preventExtensions(<var>obj</var>)</code></pre>
<h3 id="Параметри">Параметри</h3>
<dl>
<dt><code>obj</code></dt>
<dd>Об'єкт, котрий має стати нерозширюваним.</dd>
</dl>
<h3 id="Вихідне_значення">Вихідне значення</h3>
<p>Об'єкт, що робиться нерозширюваним.</p>
<h2 id="Опис">Опис</h2>
<p>Об'єкт вважається розширюваним, якщо до нього можуть бути додані нові властивості. <code>Object.preventExtensions()</code> робить об'єкт нерозширюваним, тобто таким, який уже ніколи не зможе містити інших властивостей, окрім тих, котрі він мав на момент застосування до нього даного методу. Зверніть увагу на те, що властивості нерозширюваного об'єкта все ж можна <em>видаляти</em>. Спроба ж додати нові властивості до нерозширюваного об'єкта не увінчається успіхом: або властивості просто не будуть додані без жодних помилок, або ж згенерується помилка типу {{jsxref("TypeError")}} (найчастіше, але не виключно, у {{jsxref("Strict_mode", "строгому режимі", "", 1)}}).</p>
<p><code>Object.preventExtensions()</code> має вплив лише на додавання особистих властивостей об'єкта. Властивості можуть бути додані до прототипу об'єкта.<br>
<br>
Цей метод робить <code>[[prototype]]</code> цільового об'єкта незмінним; будь-яке перевизначення <code>[[prototype]]</code> спричинить помилку <code>TypeError</code>. Ця поведінка є специфічною для внутрішньої властивості <code>[[prototype]]</code>, інші властивості цільового об'єкта залишаються змінними.</p>
<p>Як тільки об'єкт стає нерозширюваним, неможливо зробити його знову розширюваним.</p>
<h2 id="Приклади">Приклади</h2>
<pre class="brush: js">// Object.preventExtensions повертає об'єкт,
// який робиться нерозширюваним.
var obj = {};
var obj2 = Object.preventExtensions(obj);
obj === obj2; // true
// За замовчуванням усі об'єкти є розширюваними.
var empty = {};
Object.isExtensible(empty); // === true
// ...але це можна змінити.
Object.preventExtensions(empty);
Object.isExtensible(empty); // === false
// Object.defineProperty викине помилку, якщо спробувати додати
// нову вдастивість до нерозширюваного об'єкта.
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, 'new', {
value: 8675309
}); // викине TypeError
// У строгому режимі спроба додати нові властивості
// до нерозширюваного об'єкта спричиняє помилку TypeError.
function fail() {
'use strict';
// викида TypeError
nonExtensible.newProperty = 'FAIL';
}
fail();
</pre>
<p>Прототип нерозширюваного об'єкта є незмінним:</p>
<pre class="brush: js">var fixed = Object.preventExtensions({});
// викине 'TypeError'.
fixed.__proto__ = { oh: 'hai' };</pre>
<h2 id="Примітки">Примітки</h2>
<p>У ES5, якщо аргументом даного методу виступає не об'єкт (примітив), це спричинить помилку {{jsxref("TypeError")}}. У ES2015 ж, якщо аргументом методу буде не об'єкт, він буде сприйнятий як звичайний нерозширюваний об'єкт, і буде просто повернений.</p>
<pre class="brush: js">Object.preventExtensions(1);
// TypeError: 1 is not an object (код ES5)
Object.preventExtensions(1);
// 1 (код ES2015)
</pre>
<h2 id="Специфікації">Специфікації</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.10', 'Object.preventExtensions')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Початкове визначення. Реалізоване у JavaScript 1.8.5.</td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-object.preventextensions', 'Object.preventExtensions')}}</td>
<td>{{Spec2('ES6')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-object.preventextensions', 'Object.preventExtensions')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
<div>
<p>{{Compat("javascript.builtins.Object.preventExtensions")}}</p>
</div>
<h2 id="Див._також">Див. також</h2>
<ul>
<li>{{jsxref("Object.isExtensible()")}}</li>
<li>{{jsxref("Object.seal()")}}</li>
<li>{{jsxref("Object.isSealed()")}}</li>
<li>{{jsxref("Object.freeze()")}}</li>
<li>{{jsxref("Object.isFrozen()")}}</li>
<li>{{jsxref("Reflect.preventExtensions()")}}</li>
</ul>
|