From 6a8d17ae22f03daf3a256f65cfef30f00b338be4 Mon Sep 17 00:00:00 2001 From: Mykola Sopiha Date: Sat, 25 Sep 2021 23:53:06 +0300 Subject: [PATCH 01/10] property-descriptors --- .../01-property-descriptors/article.md | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index 3b72635c3..20c17674b 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -1,44 +1,44 @@ -# Property flags and descriptors +# Прапори та дескриптори властивостей -As we know, objects can store properties. +Як відомо, об'єкти можуть зберігати властивості. -Until now, a property was a simple "key-value" pair to us. But an object property is actually a more flexible and powerful thing. +До цих пір властивість була простою парою "ключ-значення" для нас. Але властивість об'єкта насправді є більш гнучкою та потужною. -In this chapter we'll study additional configuration options, and in the next we'll see how to invisibly turn them into getter/setter functions. +У цьому розділі ми вивчимо додаткові параметри конфігурації, а в наступному ми побачимо, як можна непомітно перетворити їх у функції -- гетери та сетери. -## Property flags +## Прапори властивостей -Object properties, besides a **`value`**, have three special attributes (so-called "flags"): +Властивості об'єкта, крім **`value`**, мають три спеціальні атрибути (так звані "прапори"): -- **`writable`** -- if `true`, the value can be changed, otherwise it's read-only. -- **`enumerable`** -- if `true`, then listed in loops, otherwise not listed. -- **`configurable`** -- if `true`, the property can be deleted and these attributes can be modified, otherwise not. +- **`writable`** -- якщо` true`, значення може бути змінено, інакше воно доступне лише для читання. +- **`enumerable`** -- якщо` true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. +- **`configurable`** -- якщо `true`, властивість можна видалити, а ці атрибути можна змінювати, інакше цього робити не можна. -We didn't see them yet, because generally they do not show up. When we create a property "the usual way", all of them are `true`. But we also can change them anytime. +Ми ще не бачили ці атрибути, тому що зазвичай вони не приховані. Коли ми створюємо властивість "звичайним способом", всі вони мають значення `true`. Але ми також можемо їх змінити в будь-який час. -First, let's see how to get those flags. +По-перше, давайте подивимося, як отримати ці прапори. -The method [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor) allows to query the *full* information about a property. +Метод [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor) дозволяє отримати *повну* інформацію про властивість. -The syntax is: +Синтаксис: ```js let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName); ``` `obj` -: The object to get information from. +: Об'єкт, з якого буде отримана інформація. `propertyName` -: The name of the property. +: Назва властивості. -The returned value is a so-called "property descriptor" object: it contains the value and all the flags. +Повернене значення -- це так званий об'єкт "дескриптор властивості": він містить значення та всі прапори. -For instance: +Наприклад: ```js run let user = { - name: "John" + name: "Іван" }; let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); @@ -46,7 +46,7 @@ let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); alert( JSON.stringify(descriptor, null, 2 ) ); /* property descriptor: { - "value": "John", + "value": "Іван", "writable": true, "enumerable": true, "configurable": true @@ -54,30 +54,30 @@ alert( JSON.stringify(descriptor, null, 2 ) ); */ ``` -To change the flags, we can use [Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty). +Щоб змінити прапори, ми можемо використовувати [Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty). -The syntax is: +Синтаксис: ```js Object.defineProperty(obj, propertyName, descriptor) ``` `obj`, `propertyName` -: The object and its property to apply the descriptor. +: Об'єкт і його властивість, щоб застосувати дескриптор. `descriptor` -: Property descriptor object to apply. +: Об'єкт дескриптора властивості, який буде застосовано. -If the property exists, `defineProperty` updates its flags. Otherwise, it creates the property with the given value and flags; in that case, if a flag is not supplied, it is assumed `false`. +Якщо властивість існує, `defineProperty` оновлює свої прапори. В іншому випадку метод створює властивість з данним значенням та прапорами; у цьому випадку, якщо прапор не вказано, передбачається, що його значення `false`. -For instance, here a property `name` is created with all falsy flags: +Наприклад, тут властивість `name` створюється з усіма хибними флагами: ```js run let user = {}; *!* Object.defineProperty(user, "name", { - value: "John" + value: "Іван" }); */!* @@ -86,7 +86,7 @@ let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); alert( JSON.stringify(descriptor, null, 2 ) ); /* { - "value": "John", + "value": "Іван", *!* "writable": false, "enumerable": false, @@ -96,17 +96,17 @@ alert( JSON.stringify(descriptor, null, 2 ) ); */ ``` -Compare it with "normally created" `user.name` above: now all flags are falsy. If that's not what we want then we'd better set them to `true` in `descriptor`. +Порівняйте це з попереднім прикладом "нормального створення" `user.name` вище: тепер всі прапори є хибними. Якщо це не те, що ми хочемо, тоді ми краще встановили їх значення в `true` у `descriptor`. -Now let's see effects of the flags by example. +Тепер давайте розглянемо ефекти від прапорів на прикладах. -## Non-writable +## Не для запису -Let's make `user.name` non-writable (can't be reassigned) by changing `writable` flag: +Давайте зробимо `user.name` недоступним для запису (недоступним для переприсвоення), змінюючи `writable` прапор: ```js run let user = { - name: "John" + name: "Іван" }; Object.defineProperty(user, "name", { @@ -116,49 +116,49 @@ Object.defineProperty(user, "name", { }); *!* -user.name = "Pete"; // Error: Cannot assign to read only property 'name' +user.name = "Петро"; // Помилка: неможливо присвоїти доступну лише для читання властивість 'name' */!* ``` -Now no one can change the name of our user, unless they apply their own `defineProperty` to override ours. +Тепер ніхто не може змінити ім’я нашого користувача, якщо тільки не оновить відповідний прапор викликавши `defineProperty`, щоб перекрити наші дескриптори. ```smart header="Errors appear only in strict mode" -In the non-strict mode, no errors occur when writing to non-writable properties and such. But the operation still won't succeed. Flag-violating actions are just silently ignored in non-strict. +У нестрогому режимі, без `use strict`, не виникає помилки при присвоенні значеня до недоступних для запису властивостей та ін. Але така операція все рівно не будуть виконані успішно. Дії, що порушують прапори, просто мовчки ігноруються в нестрогому режимі. ``` -Here's the same example, but the property is created from scratch: +Ось той же приклад, але властивість створена "з нуля": ```js run let user = { }; Object.defineProperty(user, "name", { *!* - value: "John", - // for new properties we need to explicitly list what's true + value: "Іван", + // для нових властивостей ми повинні явно вказати всі прапори, для яких значення true enumerable: true, configurable: true */!* }); -alert(user.name); // John -user.name = "Pete"; // Error +alert(user.name); // Іван +user.name = "Петро"; // Помилка ``` -## Non-enumerable +## Неперелічувана властивість -Now let's add a custom `toString` to `user`. +Тепер давайте додамо кастомний `toString` до `user`. -Normally, a built-in `toString` for objects is non-enumerable, it does not show up in `for..in`. But if we add a `toString` of our own, then by default it shows up in `for..in`, like this: +Зазвичай, вбудований `toString` для об'єктів неперелічуваний, він не з'являється в `for..in`. Але якщо ми додамо свій власний `toString`, то за замовчуванням він з'являється в `for..in`, як наприклад: ```js run let user = { - name: "John", + name: "Іван", toString() { return this.name; } }; -// By default, both our properties are listed: +// за замовчуванням, вказані обидві наші властивості: for (let key in user) alert(key); // name, toString ``` From bd0cb9a97ada8bd7b6bf12212ae483aacc90c8c1 Mon Sep 17 00:00:00 2001 From: Mykola Sopiha Date: Mon, 27 Sep 2021 11:37:33 +0300 Subject: [PATCH 02/10] property-descriptors --- .../01-property-descriptors/article.md | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index 20c17674b..c40ab11fc 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -148,7 +148,7 @@ user.name = "Петро"; // Помилка Тепер давайте додамо кастомний `toString` до `user`. -Зазвичай, вбудований `toString` для об'єктів неперелічуваний, він не з'являється в `for..in`. Але якщо ми додамо свій власний `toString`, то за замовчуванням він з'являється в `for..in`, як наприклад: +Зазвичай, вбудований `toString` для об'єктів неперелічуваний, тобто він не з'являється в `for..in`. Але якщо ми додамо свій власний `toString`, то за замовчуванням він з'являється в `for..in`, як наприклад: ```js run let user = { @@ -162,11 +162,11 @@ let user = { for (let key in user) alert(key); // name, toString ``` -If we don't like it, then we can set `enumerable:false`. Then it won't appear in a `for..in` loop, just like the built-in one: +Якщо нам це не подобається, то ми можемо встановити `enumerable:false`. Тоді `toString` не з'явиться в `for..in` так само, як вбудований метод. ```js run let user = { - name: "John", + name: "Іван", toString() { return this.name; } @@ -179,24 +179,24 @@ Object.defineProperty(user, "toString", { }); *!* -// Now our toString disappears: +// Тепер наш toString зникає: */!* for (let key in user) alert(key); // name ``` -Non-enumerable properties are also excluded from `Object.keys`: +Неперелічувані властивості також виключаються з `Object.keys`: ```js alert(Object.keys(user)); // name ``` -## Non-configurable +## Неналаштовувані властивості -The non-configurable flag (`configurable:false`) is sometimes preset for built-in objects and properties. +Прапор неналаштовуваної властивості (`configurable:false`) іноді встановлений для вбудованих об'єктів та властивостей. -A non-configurable property can't be deleted, its attributes can't be modified. +Неналаштовувана властивість не може бути видалена, її атрибути не можуть бути змінені. -For instance, `Math.PI` is non-writable, non-enumerable and non-configurable: +Наприклад, властивість `Math.PI` доступна тільки для читання, неперелічувана і неналаштовувана: ```js run let descriptor = Object.getOwnPropertyDescriptor(Math, 'PI'); @@ -211,47 +211,47 @@ alert( JSON.stringify(descriptor, null, 2 ) ); } */ ``` -So, a programmer is unable to change the value of `Math.PI` or overwrite it. +Отже, програміст не може змінити значення `Math.PI` або перезаписати його. ```js run -Math.PI = 3; // Error, because it has writable: false +Math.PI = 3; // Помилка, тому що властивість має writable: false -// delete Math.PI won't work either +// видалення Math.PI також не буде працювати ``` -We also can't change `Math.PI` to be `writable` again: +Ми також не можемо змінити властивість `Math.PI`, щоб вона знову була `writable`: ```js run -// Error, because of configurable: false +// Помилка, через configurable: false Object.defineProperty(Math, "PI", { writable: true }); ``` -There's absolutely nothing we can do with `Math.PI`. +Абсолютно нічого не можна зробити з `Math.PI`. -Making a property non-configurable is a one-way road. We cannot change it back with `defineProperty`. +Створення неналаштовуваної властивості -- це дорога в один кінець. Ми не можемо змінити цю властивість з `defineProperty`. **Please note: `configurable: false` prevents changes of property flags and its deletion, while allowing to change its value.** -Here `user.name` is non-configurable, but we can still change it (as it's writable): +Тут `user.name` неналаштовувана властивість, але ми все ще можемо змінити її (так як вона доступна для запису): ```js run let user = { - name: "John" + name: "Іван" }; Object.defineProperty(user, "name", { configurable: false }); -user.name = "Pete"; // works fine -delete user.name; // Error +user.name = "Петро"; // працює добре +delete user.name; // Помилка ``` -And here we make `user.name` a "forever sealed" constant, just like the built-in `Math.PI`: +І ось ми робимо `user.name` "назавжди запечатаною" константою, як і вбудована `Math.PI`: ```js run let user = { - name: "John" + name: "Іван" }; Object.defineProperty(user, "name", { @@ -259,15 +259,15 @@ Object.defineProperty(user, "name", { configurable: false }); -// won't be able to change user.name or its flags -// all this won't work: +// тепер не можливо змінювати user.name чи її прапори +// все це не буде працювати: user.name = "Pete"; delete user.name; -Object.defineProperty(user, "name", { value: "Pete" }); +Object.defineProperty(user, "name", { value: "Петро" }); ``` ```smart header="The only attribute change possible: writable true -> false" -There's a minor exception about changing flags. +Існує незначний виняток щодо зміни прапорів. We can change `writable: true` to `false` for a non-configurable property, thus preventing its value modification (to add another layer of protection). Not the other way around though. ``` From db9974f09ac7d6663141624652b18f6289d71311 Mon Sep 17 00:00:00 2001 From: Mykola Sopiha Date: Wed, 29 Sep 2021 23:50:45 +0300 Subject: [PATCH 03/10] property-descriptors --- .../01-property-descriptors/article.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index c40ab11fc..a3a15900b 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -269,14 +269,14 @@ Object.defineProperty(user, "name", { value: "Петро" }); ```smart header="The only attribute change possible: writable true -> false" Існує незначний виняток щодо зміни прапорів. -We can change `writable: true` to `false` for a non-configurable property, thus preventing its value modification (to add another layer of protection). Not the other way around though. +Ми можемо змінити `writable: true` на `false` для не неналаштовуваної властивості, таким чином, запобігаючи модифікації її значення (додає інший шар захисту). Навпаки такий підхід не працює. ``` ## Object.defineProperties -There's a method [Object.defineProperties(obj, descriptors)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties) that allows to define many properties at once. +Існує метод [Object.defineProperties(obj, descriptors)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties), що дозволяє визначити багато властивостей відразу. -The syntax is: +Синтаксис: ```js Object.defineProperties(obj, { @@ -286,29 +286,29 @@ Object.defineProperties(obj, { }); ``` -For instance: +Наприклад: ```js Object.defineProperties(user, { - name: { value: "John", writable: false }, - surname: { value: "Smith", writable: false }, + name: { value: "Іван", writable: false }, + surname: { value: "Іванов", writable: false }, // ... }); ``` -So, we can set many properties at once. +Отже, ми можемо одночасно встановити багато властивостей. ## Object.getOwnPropertyDescriptors -To get all property descriptors at once, we can use the method [Object.getOwnPropertyDescriptors(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors). +Щоб отримати всі дескриптори одночасно, ми можемо використовувати метод [Object.getOwnPropertyDescriptors(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors). -Together with `Object.defineProperties` it can be used as a "flags-aware" way of cloning an object: +Разом з `Object.defineProperties` цей метод може бути використаний як "прапорний" спосіб клонування об'єкта: ```js let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj)); ``` -Normally when we clone an object, we use an assignment to copy properties, like this: +Зазвичай, коли ми клонуємо об'єкт, ми використовуємо присвоєння для копіювання властивостей, як наприклад: ```js for (let key in user) { @@ -316,34 +316,34 @@ for (let key in user) { } ``` -...But that does not copy flags. So if we want a "better" clone then `Object.defineProperties` is preferred. +...Але це не копіює прапори. Отже, якщо ми хочемо "кращого" клону, то `Object.defineProperties` є переважним. -Another difference is that `for..in` ignores symbolic properties, but `Object.getOwnPropertyDescriptors` returns *all* property descriptors including symbolic ones. +Інша відмінність полягає в тому, що `for..in` ігнорує символьні властивості, але `Object.getOwnPropertyDescriptors` повертає *всі* дескриптори властивостей, включаючи символьні. -## Sealing an object globally +## Глобальне запечатування об'єкта -Property descriptors work at the level of individual properties. +Дескриптори властивостей працюють на рівні окремих властивостей. -There are also methods that limit access to the *whole* object: +Існують також способи, які обмежують доступ до *всього* об'єкта: [Object.preventExtensions(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions) -: Forbids the addition of new properties to the object. +: Забороняє додавання нових властивостей до об'єкта. [Object.seal(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal) -: Forbids adding/removing of properties. Sets `configurable: false` for all existing properties. +: Забороняє додавання/видалення властивостей. Встановлює `configurable: false` для всіх існуючих властивостей. [Object.freeze(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) -: Forbids adding/removing/changing of properties. Sets `configurable: false, writable: false` for all existing properties. +: Забороняє додавання/видалення/зміну властивостей. Встановлює `configurable: false, writable: false` для всіх існуючих властивостей. -And also there are tests for them: +А також для них є тести: [Object.isExtensible(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible) -: Returns `false` if adding properties is forbidden, otherwise `true`. +: Повертає `false`, якщо додавання властивостей заборонено, інакше `true`. [Object.isSealed(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed) -: Returns `true` if adding/removing properties is forbidden, and all existing properties have `configurable: false`. +: Повертає `true`, якщо додавання/видалення властивостей заборонено, і всі існуючі властивості мають `configurable: false`. [Object.isFrozen(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen) -: Returns `true` if adding/removing/changing properties is forbidden, and all current properties are `configurable: false, writable: false`. +: Повертає `true`, якщо додавання/видалення/зміна властивостей заборонена і всі поточні властивості є `configurable: false, writable: false`. -These methods are rarely used in practice. +Ці методи рідко використовуються на практиці. From e27612e34fbdd1ab9116c89f891355a4bbf3c249 Mon Sep 17 00:00:00 2001 From: Mykola Sopiha Date: Thu, 30 Sep 2021 00:08:16 +0300 Subject: [PATCH 04/10] property-descriptors --- .../01-property-descriptors/article.md | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index a3a15900b..dabef0ba4 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -1,15 +1,15 @@ # Прапори та дескриптори властивостей -Як відомо, об'єкти можуть зберігати властивості. +Як відомо, об’єкти можуть зберігати властивості. -До цих пір властивість була простою парою "ключ-значення" для нас. Але властивість об'єкта насправді є більш гнучкою та потужною. +Дотепер властивість була простою парою "ключ-значення" для нас. Але властивість об’єкта насправді є більш гнучкою та потужною. У цьому розділі ми вивчимо додаткові параметри конфігурації, а в наступному ми побачимо, як можна непомітно перетворити їх у функції -- гетери та сетери. ## Прапори властивостей -Властивості об'єкта, крім **`value`**, мають три спеціальні атрибути (так звані "прапори"): +Властивості об’єкта, крім **`value`**, мають три спеціальні атрибути (так звані "прапори"): - **`writable`** -- якщо` true`, значення може бути змінено, інакше воно доступне лише для читання. - **`enumerable`** -- якщо` true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. @@ -17,7 +17,7 @@ Ми ще не бачили ці атрибути, тому що зазвичай вони не приховані. Коли ми створюємо властивість "звичайним способом", всі вони мають значення `true`. Але ми також можемо їх змінити в будь-який час. -По-перше, давайте подивимося, як отримати ці прапори. +По-перше, подивімось, як отримати ці прапори. Метод [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor) дозволяє отримати *повну* інформацію про властивість. @@ -27,12 +27,12 @@ let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName); ``` `obj` -: Об'єкт, з якого буде отримана інформація. +: Об’єкт, з якого буде отримана інформація. `propertyName` : Назва властивості. -Повернене значення -- це так званий об'єкт "дескриптор властивості": він містить значення та всі прапори. +Повернене значення -- це так званий об’єкт "дескриптор властивості": він містить значення та всі прапори. Наприклад: @@ -63,14 +63,14 @@ Object.defineProperty(obj, propertyName, descriptor) ``` `obj`, `propertyName` -: Об'єкт і його властивість, щоб застосувати дескриптор. +: Об’єкт і його властивість, щоб застосувати дескриптор. `descriptor` -: Об'єкт дескриптора властивості, який буде застосовано. +: Об’єкт дескриптора властивості, який буде застосовано. -Якщо властивість існує, `defineProperty` оновлює свої прапори. В іншому випадку метод створює властивість з данним значенням та прапорами; у цьому випадку, якщо прапор не вказано, передбачається, що його значення `false`. +Якщо властивість існує, `defineProperty` оновлює свої прапори. В іншому випадку метод створює властивість з даним значенням та прапорами; у цьому випадку, якщо прапор не вказано, передбачається, що його значення `false`. -Наприклад, тут властивість `name` створюється з усіма хибними флагами: +Наприклад, тут властивість `name` створюється з усіма хибними прапорами: ```js run let user = {}; @@ -98,11 +98,11 @@ alert( JSON.stringify(descriptor, null, 2 ) ); Порівняйте це з попереднім прикладом "нормального створення" `user.name` вище: тепер всі прапори є хибними. Якщо це не те, що ми хочемо, тоді ми краще встановили їх значення в `true` у `descriptor`. -Тепер давайте розглянемо ефекти від прапорів на прикладах. +Тепер розгляньмо ефекти від прапорів на прикладах. ## Не для запису -Давайте зробимо `user.name` недоступним для запису (недоступним для переприсвоення), змінюючи `writable` прапор: +Зробімо `user.name` недоступним для запису (недоступним для переприсвоєння), змінюючи `writable` прапор: ```js run let user = { @@ -123,7 +123,7 @@ user.name = "Петро"; // Помилка: неможливо присвоїт Тепер ніхто не може змінити ім’я нашого користувача, якщо тільки не оновить відповідний прапор викликавши `defineProperty`, щоб перекрити наші дескриптори. ```smart header="Errors appear only in strict mode" -У нестрогому режимі, без `use strict`, не виникає помилки при присвоенні значеня до недоступних для запису властивостей та ін. Але така операція все рівно не будуть виконані успішно. Дії, що порушують прапори, просто мовчки ігноруються в нестрогому режимі. +У нестрогому режимі, без `use strict`, не виникає помилки при присвоєнні значення до недоступних для запису властивостей та ін. Але така операція все рівно не будуть виконані успішно. Дії, що порушують прапори, просто мовчки ігноруються в нестрогому режимі. ``` Ось той же приклад, але властивість створена "з нуля": @@ -146,9 +146,9 @@ user.name = "Петро"; // Помилка ## Неперелічувана властивість -Тепер давайте додамо кастомний `toString` до `user`. +Тепер додаймо кастомний `toString` до `user`. -Зазвичай, вбудований `toString` для об'єктів неперелічуваний, тобто він не з'являється в `for..in`. Але якщо ми додамо свій власний `toString`, то за замовчуванням він з'являється в `for..in`, як наприклад: +Зазвичай, вбудований `toString` для об’єктів неперелічуваний, тобто він не з’являється в `for..in`. Але якщо ми додамо свій власний `toString`, то за замовчуванням він з’являється в `for..in`: ```js run let user = { @@ -162,7 +162,7 @@ let user = { for (let key in user) alert(key); // name, toString ``` -Якщо нам це не подобається, то ми можемо встановити `enumerable:false`. Тоді `toString` не з'явиться в `for..in` так само, як вбудований метод. +Якщо нам це не подобається, то ми можемо встановити `enumerable:false`. Тоді `toString` не з’явиться в `for..in` так само, як вбудований метод. ```js run let user = { @@ -192,7 +192,7 @@ alert(Object.keys(user)); // name ## Неналаштовувані властивості -Прапор неналаштовуваної властивості (`configurable:false`) іноді встановлений для вбудованих об'єктів та властивостей. +Прапор неналаштовуваної властивості (`configurable:false`) іноді встановлений для вбудованих об’єктів та властивостей. Неналаштовувана властивість не може бути видалена, її атрибути не можуть бути змінені. @@ -232,7 +232,7 @@ Object.defineProperty(Math, "PI", { writable: true }); **Please note: `configurable: false` prevents changes of property flags and its deletion, while allowing to change its value.** -Тут `user.name` неналаштовувана властивість, але ми все ще можемо змінити її (так як вона доступна для запису): +Тут `user.name` неналаштовувана властивість, але ми все ще можемо змінити її (бо вона доступна для запису): ```js run let user = { @@ -302,13 +302,13 @@ Object.defineProperties(user, { Щоб отримати всі дескриптори одночасно, ми можемо використовувати метод [Object.getOwnPropertyDescriptors(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors). -Разом з `Object.defineProperties` цей метод може бути використаний як "прапорний" спосіб клонування об'єкта: +Разом з `Object.defineProperties` цей метод може бути використаний як "прапорний" спосіб клонування об’єкта: ```js let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj)); ``` -Зазвичай, коли ми клонуємо об'єкт, ми використовуємо присвоєння для копіювання властивостей, як наприклад: +Зазвичай, коли ми клонуємо об’єкт, ми використовуємо присвоєння для копіювання властивостей: ```js for (let key in user) { @@ -320,20 +320,20 @@ for (let key in user) { Інша відмінність полягає в тому, що `for..in` ігнорує символьні властивості, але `Object.getOwnPropertyDescriptors` повертає *всі* дескриптори властивостей, включаючи символьні. -## Глобальне запечатування об'єкта +## Глобальне запечатування об’єкта Дескриптори властивостей працюють на рівні окремих властивостей. -Існують також способи, які обмежують доступ до *всього* об'єкта: +Існують також способи, які обмежують доступ до *всього* об’єкта: [Object.preventExtensions(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions) -: Забороняє додавання нових властивостей до об'єкта. +: Забороняє додавання нових властивостей до об’єкта. [Object.seal(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal) -: Забороняє додавання/видалення властивостей. Встановлює `configurable: false` для всіх існуючих властивостей. +: Забороняє додавання/видалення властивостей. Встановлює `configurable: false` для всіх властивостей, що існують. [Object.freeze(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) -: Забороняє додавання/видалення/зміну властивостей. Встановлює `configurable: false, writable: false` для всіх існуючих властивостей. +: Забороняє додавання/видалення/зміну властивостей. Встановлює `configurable: false, writable: false` для всіх властивостей, що існують. А також для них є тести: @@ -341,7 +341,7 @@ for (let key in user) { : Повертає `false`, якщо додавання властивостей заборонено, інакше `true`. [Object.isSealed(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed) -: Повертає `true`, якщо додавання/видалення властивостей заборонено, і всі існуючі властивості мають `configurable: false`. +: Повертає `true`, якщо додавання/видалення властивостей заборонено, і всі властивості, що існують, мають `configurable: false`. [Object.isFrozen(obj)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen) : Повертає `true`, якщо додавання/видалення/зміна властивостей заборонена і всі поточні властивості є `configurable: false, writable: false`. From d700189559a9d5b0a5ad94452d03eee86725f007 Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:09:42 +0300 Subject: [PATCH 05/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index dabef0ba4..e37a23fc6 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -3,7 +3,7 @@ Як відомо, об’єкти можуть зберігати властивості. -Дотепер властивість була простою парою "ключ-значення" для нас. Але властивість об’єкта насправді є більш гнучкою та потужною. +Дотепер, для нас властивість була простою парою "ключ-значення". Однак насправді, властивість об’єкта є гнучкішою та потужнішою. У цьому розділі ми вивчимо додаткові параметри конфігурації, а в наступному ми побачимо, як можна непомітно перетворити їх у функції -- гетери та сетери. From cb4bf98b1204026b091d4bb80c3973fa38ad6f7c Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:11:18 +0300 Subject: [PATCH 06/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index e37a23fc6..0004edc22 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -11,7 +11,7 @@ Властивості об’єкта, крім **`value`**, мають три спеціальні атрибути (так звані "прапори"): -- **`writable`** -- якщо` true`, значення може бути змінено, інакше воно доступне лише для читання. +- **`writable`** -- якщо `true`, значення можна змінювати, інакше воно доступне лише для читання. - **`enumerable`** -- якщо` true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. - **`configurable`** -- якщо `true`, властивість можна видалити, а ці атрибути можна змінювати, інакше цього робити не можна. From c9ca601e3b1162a67f84b177f9e69db8bf5f2020 Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:12:00 +0300 Subject: [PATCH 07/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index 0004edc22..d9066f5aa 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -12,7 +12,7 @@ Властивості об’єкта, крім **`value`**, мають три спеціальні атрибути (так звані "прапори"): - **`writable`** -- якщо `true`, значення можна змінювати, інакше воно доступне лише для читання. -- **`enumerable`** -- якщо` true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. +- **`enumerable`** -- якщо `true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. - **`configurable`** -- якщо `true`, властивість можна видалити, а ці атрибути можна змінювати, інакше цього робити не можна. Ми ще не бачили ці атрибути, тому що зазвичай вони не приховані. Коли ми створюємо властивість "звичайним способом", всі вони мають значення `true`. Але ми також можемо їх змінити в будь-який час. From f2b14dbe33a48e7df9372a5ffdf78cc37d056073 Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:19:16 +0300 Subject: [PATCH 08/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index d9066f5aa..f988bca7c 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -15,7 +15,7 @@ - **`enumerable`** -- якщо `true`, то властивість враховується в циклах, в іншому випадку цикли його ігнорують. - **`configurable`** -- якщо `true`, властивість можна видалити, а ці атрибути можна змінювати, інакше цього робити не можна. -Ми ще не бачили ці атрибути, тому що зазвичай вони не приховані. Коли ми створюємо властивість "звичайним способом", всі вони мають значення `true`. Але ми також можемо їх змінити в будь-який час. +Ми ще не бачили цих атрибутів, тому що вони зазвичай не показуються. Коли ми створюємо властивість "звичайним способом", всі атрибути мають значення `true`. Але ми також можемо їх змінити в будь-який час. По-перше, подивімось, як отримати ці прапори. From e4d26e8b46dda18a0c6f773dfe6c63b5a1658f8e Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:21:52 +0300 Subject: [PATCH 09/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index f988bca7c..f7a944935 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -68,7 +68,7 @@ Object.defineProperty(obj, propertyName, descriptor) `descriptor` : Об’єкт дескриптора властивості, який буде застосовано. -Якщо властивість існує, `defineProperty` оновлює свої прапори. В іншому випадку метод створює властивість з даним значенням та прапорами; у цьому випадку, якщо прапор не вказано, передбачається, що його значення `false`. +Якщо властивість існує, `defineProperty` оновлює її прапори. В іншому випадку метод створює властивість з даним значенням та прапорами; у цьому випадку, якщо прапор не вказано, передбачається, що його значення `false`. Наприклад, тут властивість `name` створюється з усіма хибними прапорами: From 392673c415bbca085d3e75f555f0c6933119f663 Mon Sep 17 00:00:00 2001 From: Taras Date: Thu, 30 Sep 2021 21:29:12 +0300 Subject: [PATCH 10/10] Update 1-js/07-object-properties/01-property-descriptors/article.md --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index f7a944935..e484f3bc6 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -123,7 +123,7 @@ user.name = "Петро"; // Помилка: неможливо присвоїт Тепер ніхто не може змінити ім’я нашого користувача, якщо тільки не оновить відповідний прапор викликавши `defineProperty`, щоб перекрити наші дескриптори. ```smart header="Errors appear only in strict mode" -У нестрогому режимі, без `use strict`, не виникає помилки при присвоєнні значення до недоступних для запису властивостей та ін. Але така операція все рівно не будуть виконані успішно. Дії, що порушують прапори, просто мовчки ігноруються в нестрогому режимі. +В несуворому режимі (без `use strict`), під час запису значення до недоступних для запису властивостей не виникне помилки. Однак така операція все одно не змінить значення. Дії, що порушують прапори, просто мовчки ігноруються в несуворому режимі. ``` Ось той же приклад, але властивість створена "з нуля":