Skip to content

Commit fce38c1

Browse files
committed
Replace with eyo
1 parent 207641a commit fce38c1

3 files changed

Lines changed: 20 additions & 20 deletions

File tree

1-js/08-prototypes/04-prototype-methods/2-dictionary-tostring/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ for(let key in dictionary) {
2626
alert(dictionary); // "apple,__proto__"
2727
```
2828

29-
Когда мы создаем свойство с помощью дескриптора, все флаги по умолчанию имеют значение `false`. Таким образом, в коде выше `dictionary.toString` не перечисляемое свойство.
29+
Когда мы создаём свойство с помощью дескриптора, все флаги по умолчанию имеют значение `false`. Таким образом, в коде выше `dictionary.toString` не перечисляемое свойство.
3030

3131
Смотрите главу [](info:property-descriptors) для ознакомления.

1-js/08-prototypes/04-prototype-methods/2-dictionary-tostring/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ importance: 5
66

77
Имеется объект `dictionary`, созданный с помощью `Object.create(null)` для хранения любых пар `ключ/значение`.
88

9-
Добавьте ему метод `dictionary.toString()`, который должен возвращать список ключей разделенных запятой. Ваш `toString` не должен выводиться при итерации объекта с помощью цикла `for..in`.
9+
Добавьте ему метод `dictionary.toString()`, который должен возвращать список ключей разделённых запятой. Ваш `toString` не должен выводиться при итерации объекта с помощью цикла `for..in`.
1010

1111
Вот так это должно работать:
1212

1-js/08-prototypes/04-prototype-methods/article.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
Современные методы это:
99

10-
- [Object.create(proto[, descriptors])](mdn:js/Object/create) -- создает пустой объект со свойством `[[Prototype]]`, указанным как `proto`, и необязательными дескрипторами свойств.
10+
- [Object.create(proto[, descriptors])](mdn:js/Object/create) -- создаёт пустой объект со свойством `[[Prototype]]`, указанным как `proto`, и необязательными дескрипторами свойств.
1111
- [Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- возвращает свойство `[[Prototype]]` объекта `obj`.
1212
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- устанавливает свойство `[[Prototype]]` объекта `obj` как `proto`.
1313

@@ -20,7 +20,7 @@ let animal = {
2020
eats: true
2121
};
2222

23-
// создаем новый объект с прототипом animal
23+
// создаём новый объект с прототипом animal
2424
*!*
2525
let rabbit = Object.create(animal);
2626
*/!*
@@ -60,7 +60,7 @@ alert(rabbit.jumps); // true
6060
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
6161
```
6262

63-
Такой вызов создает точную копию объекта `obj`, включая все свойства: перечисляемые и не перечисляемые, свойства, геттеры/сеттеры для свойств -- и все это с правильным свойством `[[Prototype]]`.
63+
Такой вызов создаёт точную копию объекта `obj`, включая все свойства: перечисляемые и не перечисляемые, свойства, геттеры/сеттеры для свойств -- и все это с правильным свойством `[[Prototype]]`.
6464

6565
## Краткая история
6666

@@ -70,13 +70,13 @@ let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescr
7070

7171
В силу исторических причин.
7272

73-
- Свойство `"prototype"` функции-конструктора существует еще с очень давних времен.
73+
- Свойство `"prototype"` функции-конструктора существует ещё с очень давних времён.
7474
- Позднее в 2012 году: `Object.create` появился в стандарте. Это давало возможность создавать объекты с указанным прототипом, но так же не позволяло устанавливать/получать его. Тогда браузеры реализовали нестандартный аксессор `__proto__`, который позволил устанавливать/получать прототип в любой время.
7575
- Позднее и 2015 году: в стандарт были добавлены `Object.setPrototypeOf` и `Object.getPrototypeOf`. Фактически свойство `__proto__` было реализовано везде, так что оно попало Приложение Б стандарта, которое было опционально для не браузерных окружений.
7676

7777
Теперь мы знаем, что у нас есть все эти способы в нашем распоряжении.
7878

79-
Почему же `__proto__` был заменен на функции? Вопрос интересный, требующий от нас понимания, почему `__proto__` плох. Читайте далее, чтобы узнать ответ.
79+
Почему же `__proto__` был заменён на функции? Вопрос интересный, требующий от нас понимания, почему `__proto__` плох. Читайте далее, чтобы узнать ответ.
8080

8181
```warn header="Не переопределяйте `[[Prototype]]`, кроме случаев, когда скорость не важна"
8282
Технически, мы можем установить/получить `[[Prototype]]` в любое время. Но обычно мы устанавливаем прототип только раз во время создания объекта, а после не меняем: `rabbit` наследует от `animal`, и это не изменится.
@@ -101,13 +101,13 @@ obj[key] = "some value";
101101
alert(obj[key]); // [object Object], не "some value"!
102102
```
103103

104-
Если пользователь введет `__proto__`, присвоение проигнорируется!
104+
Если пользователь введёт `__proto__`, присвоение проигнорируется!
105105

106106
И это не должно удивлять нас. Свойство `__proto__` особенное: оно должно быть либо объектом, либо `null`, а строка не может стать прототипом.
107107

108-
Но мы не *намеревались* реализовывать такое поведение, не так ли? Мы хотим хранить пары ключ/значение, и ключ с именем `"__proto__"` не был сохранен надлежащим образом. Так что это ошибка!
108+
Но мы не *намеревались* реализовывать такое поведение, не так ли? Мы хотим хранить пары ключ/значение, и ключ с именем `"__proto__"` не был сохранён надлежащим образом. Так что это ошибка!
109109

110-
В примере последствия не так ужасны. Но в других случаях прототип может быть изменен, и код может выполниться совершенно неожиданным неправильным способом.
110+
В примере последствия не так ужасны. Но в других случаях прототип может быть изменён, и код может выполниться совершенно неожиданным неправильным способом.
111111

112112
Что хуже всего -- разработчики не задумываются о такой возможности совсем. Это делает такие ошибки сложным для отлавливания или даже превращает их в уязвимости, особенно когда JavaScript используется на сервере.
113113

@@ -140,13 +140,13 @@ obj[key] = "some value";
140140
alert(obj[key]); // "some value"
141141
```
142142

143-
`Object.create(null)` создает пустой объект без прототипа (свойство `[[Prototype]]` это `null`):
143+
`Object.create(null)` создаёт пустой объект без прототипа (свойство `[[Prototype]]` это `null`):
144144

145145
![](object-prototype-null.png)
146146

147-
Таким образом не будет унаследованного геттера/сеттера для `__proto__`. Теперь это свойство обрабатывается как обычное свойство, и пример приведенный выше работает правильно.
147+
Таким образом не будет унаследованного геттера/сеттера для `__proto__`. Теперь это свойство обрабатывается как обычное свойство, и пример приведённый выше работает правильно.
148148

149-
Мы можем назвать такой объект "очень пустым" или "чистым словарным объектом", потому что они еще проще чем обычные объекты `{...}`.
149+
Мы можем назвать такой объект "очень пустым" или "чистым словарным объектом", потому что они ещё проще чем обычные объекты `{...}`.
150150

151151
Недостаток в том, что у таких объектов не будет встроенных методов объекта, таких как `toString`:
152152

@@ -175,25 +175,25 @@ alert(Object.keys(chineseDictionary)); // hello,bye
175175

176176
Современные способы установки и прямого доступа к прототипу это:
177177

178-
- [Object.create(proto[, descriptors])](mdn:js/Object/create) -- создает пустой объект со свойством `[[Prototype]]`, указанным как `proto` (может быть `null`), и необязательными дескрипторами свойств.
178+
- [Object.create(proto[, descriptors])](mdn:js/Object/create) -- создаёт пустой объект со свойством `[[Prototype]]`, указанным как `proto` (может быть `null`), и необязательными дескрипторами свойств.
179179
- [Object.getPrototypeOf(obj)](mdn:js/Object.getPrototypeOf) -- возвращает свойство `[[Prototype]]` объекта `obj` (то же самое что и геттер `__proto__`).
180180
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object.setPrototypeOf) -- устанавливает свойство `[[Prototype]]` объекта `obj` как `proto` (то же самое что и сеттер `__proto__`).
181181

182-
Встроенный геттер/сеттер __proto__ не безопасен, если мы хотим использовать *созданные пользователями* ключи в объекте. Как минимум потому, что пользователь может ввести "proto" как ключ, от чего может возникнуть ошибка. Если повезет - последствия будут легкими, но обычно они непредсказуемы.
182+
Встроенный геттер/сеттер __proto__ не безопасен, если мы хотим использовать *созданные пользователями* ключи в объекте. Как минимум потому, что пользователь может ввести "proto" как ключ, от чего может возникнуть ошибка. Если повезёт - последствия будут лёгкими, но обычно они непредсказуемы.
183183

184184
Тогда мы можем использовать либо `Object.create(null)` для создания "очень пустого" объекта, либо использовать коллекцию `Map`.
185185

186-
Также, `Object.create` дает нам легкий способ создать поверхностную копию объекты со всеми дескрипторами:
186+
Также, `Object.create` даёт нам лёгкий способ создать поверхностную копию объекты со всеми дескрипторами:
187187

188188
```js
189189
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
190190
```
191191

192192

193-
- [Object.keys(obj)](mdn:js/Object/keys) / [Object.values(obj)](mdn:js/Object/values) / [Object.entries(obj)](mdn:js/Object/entries) -- возвращают массив всех перечисляемых собственных строковых имен/значений/пар ключ-значение.
194-
- [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) -- возвращает массив всех собственных символьных имен свойств.
195-
- [Object.getOwnPropertyNames(obj)](mdn:js/Object/getOwnPropertyNames) -- возвращает массив всех собственных строковых имен свойств.
196-
- [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) -- возвращает массив всех собственных имен свойств.
193+
- [Object.keys(obj)](mdn:js/Object/keys) / [Object.values(obj)](mdn:js/Object/values) / [Object.entries(obj)](mdn:js/Object/entries) -- возвращают массив всех перечисляемых собственных строковых имён/значений/пар ключ-значение.
194+
- [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) -- возвращает массив всех собственных символьных имён свойств.
195+
- [Object.getOwnPropertyNames(obj)](mdn:js/Object/getOwnPropertyNames) -- возвращает массив всех собственных строковых имён свойств.
196+
- [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) -- возвращает массив всех собственных имён свойств.
197197
- [obj.hasOwnProperty(key)](mdn:js/Object/hasOwnProperty): возвращает `true`, если у `obj` есть собственное (не унаследованное) свойство с именем `key`.
198198

199199
Мы также ясно указали, что `__proto__` -- это геттер/сеттер для свойства `[[Prototype]]` и находится он в `Object.prototype`, как и другие методы.

0 commit comments

Comments
 (0)