Skip to content

Commit 79f3d85

Browse files
authored
Merge pull request #1759 from iamdennshi/master
Update article.md
2 parents 9e966c0 + 58bfa6f commit 79f3d85

File tree

1 file changed

+33
-13
lines changed
  • 1-js/07-object-properties/01-property-descriptors

1 file changed

+33
-13
lines changed

1-js/07-object-properties/01-property-descriptors/article.md

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ alert(Object.keys(user)); // name
194194

195195
Флаг неконфигурируемого свойства (`configurable:false`) иногда предустановлен для некоторых встроенных объектов и свойств.
196196

197-
Неконфигурируемое свойство не может быть удалено.
197+
Неконфигурируемое свойство не может быть удалено, его атрибуты не могут быть изменены.
198198

199199
Например, свойство `Math.PI` - только для чтения, неперечислимое и неконфигурируемое:
200200

@@ -214,33 +214,53 @@ alert( JSON.stringify(descriptor, null, 2 ) );
214214
То есть программист не сможет изменить значение `Math.PI` или перезаписать его.
215215

216216
```js run
217-
Math.PI = 3; // Ошибка
217+
Math.PI = 3; // Ошибка, потому что writable: false
218218

219219
// delete Math.PI тоже не сработает
220220
```
221+
Мы также не можем изменить `writable`:
221222

222-
Определение свойства как неконфигурируемого - это дорога в один конец. Мы не сможем отменить это действие, потому что `defineProperty` не работает с неконфигурируемыми свойствами.
223+
```js run
224+
// Ошибка, из-за configurable: false
225+
Object.defineProperty(Math, "PI", { writable: true });
226+
```
227+
Мы абсолютно ничего не можем сделать с `Math.PI`.
228+
229+
Определение свойства как неконфигурируемого - это дорога в один конец. Мы не можем изменить его обратно с помощью `defineProperty`.
223230

224-
В коде ниже мы делаем `user.name` "навечно запечатанной" константой:
231+
**Обратите внимание: `configurable: false` не даст изменить флаги свойства, а также не даст его удалить. При этом можно изменить значение свойства.**
232+
233+
В коде ниже свойство `user.name` является неконфигурируемым, но мы все ещё можем изменить его значение (т.к. `writable: true`).
225234

226235
```js run
227-
let user = { };
236+
let user = {
237+
name: "John"
238+
};
239+
240+
Object.defineProperty(user, "name", {
241+
configurable: false
242+
});
243+
244+
user.name = "Pete"; // работает
245+
delete user.name; // Ошибка
246+
```
247+
А здесь мы делаем `user.name` "навечно запечатанной" константой, как и встроенный `Math.PI`:
248+
```js run
249+
let user = {
250+
name: "John"
251+
};
228252

229253
Object.defineProperty(user, "name", {
230-
value: "John",
231254
writable: false,
232255
configurable: false
233256
});
234257

235-
*!*
236258
// теперь невозможно изменить user.name или его флаги
237259
// всё это не будет работать:
238-
// user.name = "Pete"
239-
// delete user.name
240-
// defineProperty(user, "name", ...)
241-
Object.defineProperty(user, "name", {writable: true}); // Ошибка
242-
*/!*
243-
```
260+
user.name = "Pete";
261+
delete user.name;
262+
Object.defineProperty(user, "name", { value: "Pete" });
263+
```
244264

245265
```smart header="Ошибки отображаются только в строгом режиме"
246266
В нестрогом режиме мы не увидим никаких ошибок при записи в свойства "только для чтения" и т.п. Эти операции всё равно не будут выполнены успешно. Действия, нарушающие ограничения флагов, в нестрогом режиме просто молча игнорируются.

0 commit comments

Comments
 (0)