You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/08-prototypes/04-prototype-methods/article.md
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,13 +5,13 @@
5
5
6
6
Свойство `__proto__` считается устаревшим и в некотором роде нежелательным (только в браузерной части стандарта JavaScript).
7
7
8
-
Современные методы:
8
+
Современные методы это:
9
9
10
10
-[Object.create(proto[, descriptors])](mdn:js/Object/create) -- создает пустой объект со свойством `[[Prototype]]`, указанным как `proto`, и необязательными дескрипторами свойств.
11
11
-[Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- возвращает свойство `[[Prototype]]` объекта `obj`.
12
12
-[Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- устанавливает свойство `[[Prototype]]` объекта `obj` как `proto`.
13
13
14
-
Эти методы должны быть использованы вместо `__proto__`.
Object.setPrototypeOf(rabbit, {}); //изменяем прототип объект rabbit на {}
34
+
Object.setPrototypeOf(rabbit, {}); //заменяем прототип объект rabbit на {}
35
35
*/!*
36
36
```
37
37
@@ -51,16 +51,16 @@ let rabbit = Object.create(animal, {
51
51
alert(rabbit.jumps); // true
52
52
```
53
53
54
-
У дескрипторов такой же формат как описано в этой главе <info:property-descriptors>.
54
+
У дескрипторов такой же формат как описано в главе <info:property-descriptors>.
55
55
56
-
Мы можем использовать `Object.create` для клонирования объектов как более мощный способ чем копирование свойств с помощью `for..in`:
56
+
Мы можем использовать `Object.create` для клонирования объектов как более мощный способ чем копирование свойств с помощью цикла `for..in`:
57
57
58
58
```js
59
59
// полностью идентичный поверхностный клон obj
60
60
let clone =Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
61
61
```
62
62
63
-
Подобный вызов создает точную копию объекта `obj`, включая все свойства: перечисляемые и не перечисляемые, свойства, геттеры/сеттеры для свойств -- и все это с правильным свойством `[[Prototype]]`.
63
+
Такой вызов создает точную копию объекта `obj`, включая все свойства: перечисляемые и не перечисляемые, свойства, геттеры/сеттеры для свойств -- и все это с правильным свойством `[[Prototype]]`.
В примере последствия не так ужасны. Но в других случаях прототип может быть изменен, и код может выполниться совершенно неожиданным неправильным способом.
111
111
112
-
Что хуже всего -- разработчики не думают о такой возможности совсем. Это делает такие ошибки сложным для отлавливания или даже превращает их в уязвимости, особенно когда JavaScript используется на сервере.
112
+
Что хуже всего -- разработчики не задумываются о такой возможности совсем. Это делает такие ошибки сложным для отлавливания или даже превращает их в уязвимости, особенно когда JavaScript используется на сервере.
113
113
114
114
Неожиданные вещи могут случаться также при получении доступа к свойству `toString`, которое по умолчанию функция, и к другим встроенным свойствам.
115
115
116
-
Как избежать проблемы?
116
+
Как же избежать проблемы?
117
117
118
-
Во-первых, мы можем перейти на использование коллекции `Map`, и тогда все будет в порядке.
118
+
Во-первых, мы можем переключиться на использование коллекции `Map`, и тогда все будет в порядке.
119
119
120
120
Но и `Object` может также хорошо подойти, потому что создатели языка уже давно продумали решение проблемы.
121
121
@@ -160,7 +160,7 @@ alert(obj); // Error (no toString)
160
160
161
161
...Но обычно этого достаточно для ассоциативных массивов.
162
162
163
-
Пожалуйста, обратите внимание, что большая часть методов `Object.something(...)` связанных с объектами, таких как `Object.keys(obj)` -- они не находятся в прототипе, так что они продолжать работать для таких объектов:
163
+
Пожалуйста, обратите внимание, что большая часть методов `Object.something(...)` связанных с объектами, таких как `Object.keys(obj)`, не находятся в прототипе, так что они продолжат работать для таких объектов:
164
164
165
165
166
166
```js run
@@ -191,7 +191,7 @@ let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescr
191
191
192
192
193
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) -- возвращает массив всех собственных имен-символов свойств.
194
+
-[Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) -- возвращает массив всех собственных символьных имен свойств.
195
195
-[Object.getOwnPropertyNames(obj)](mdn:js/Object/getOwnPropertyNames) -- возвращает массив всех собственных строковых имен свойств.
196
196
-[Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) -- возвращает массив всех собственных имен свойств.
197
197
-[obj.hasOwnProperty(key)](mdn:js/Object/hasOwnProperty): возвращает `true`, если у `obj` есть собственное (не унаследованное) свойство с именем `key`.
0 commit comments