Skip to content

Commit cf6c1d0

Browse files
committed
minor
1 parent 645f1e3 commit cf6c1d0

File tree

3 files changed

+20
-18
lines changed

3 files changed

+20
-18
lines changed

1-js/08-prototypes/01-prototype-inheritance/article.md

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
![prototype](object-prototype-empty.svg)
1414

15-
Этот `[[Prototype]]` даёт нам немного "магии". Когда мы хотим прочитать свойство из `объекта`, а оно отсутствует, JavaScript автоматически берет его из прототипа. В программировании такой механизм называется "прототипным наследованием". Многие интересные возможности языка и техники программирования основываются на нем.
15+
Прототип даёт нам немного "магии". Когда мы хотим прочитать свойство из `object`, а оно отсутствует, JavaScript автоматически берет его из прототипа. В программировании такой механизм называется "прототипным наследованием". Многие интересные возможности языка и техники программирования основываются на нем.
1616

17-
Свойство `[[Prototype]]` является внутренним и скрытым, но есть много способов задать его самостоятельно.
17+
Свойство `[[Prototype]]` является внутренним и скрытым, но есть много способов задать его.
1818

1919
Одним из них является использование `__proto__`, например так:
2020

@@ -36,7 +36,7 @@ rabbit.__proto__ = animal;
3636

3737
Он существует по историческим причинам, в современном языке его заменяют функции `Object.getPrototypeOf/Object.setPrototypeOf`, которые также получают/устанавливают прототип. Мы рассмотрим причины этого и эти функции позже.
3838

39-
По спецификации `__proto__` должен поддерживаться только браузерами, но на самом деле все среды, включая серверную, поддерживают его. На данный момент, поскольку нотация `__proto__` немного более понятна, мы будем использовать её в примерах.
39+
По спецификации `__proto__` должен поддерживаться только браузерами, но по факту все среды, включая серверную, поддерживают его. Далее мы будем в примерах использовать `__proto__`, так как это самый короткий и интуитивно понятный способ установки и чтения прототипа.
4040
```
4141
4242
Если мы ищем свойство в `rabbit`, а оно отсутствует, JavaScript автоматически берет его из `animal`.
@@ -68,7 +68,7 @@ alert( rabbit.jumps ); // true
6868

6969
![](proto-animal-rabbit.svg)
7070

71-
Здесь мы можем сказать, что "`animal` является прототипом `rabbit`" или "`rabbit` прототипно наследуется от `animal`".
71+
Здесь мы можем сказать, что "`animal` является прототипом `rabbit`" или "`rabbit` прототипно наследует от `animal`".
7272

7373
Так что если у `animal` много полезных свойств и методов, то они автоматически становятся доступными у `rabbit`. Такие свойства называются "унаследованными".
7474

@@ -101,7 +101,6 @@ rabbit.walk(); // Animal walk
101101

102102
Цепочка прототипов может быть длиннее:
103103

104-
105104
```js run
106105
let animal = {
107106
eats: true,
@@ -131,12 +130,12 @@ alert(longEar.jumps); // true (для rabbit)
131130

132131
![](proto-animal-rabbit-chain.svg)
133132

134-
На самом деле есть только два ограничения:
133+
Есть только два ограничения:
135134

136135
1. Ссылки не могут идти по кругу. JavaScript выдаст ошибку, если мы попытаемся назначить `__proto__` по кругу.
137-
2. Значение `__proto__` может быть как объектом, так и `null`, другие типы (например, примитивы) игнорируются.
136+
2. Значение `__proto__` может быть объектом или `null`. Другие типы игнорируются.
138137

139-
Это вполне очевидно, но все же: может быть только один `[[Prototype]]`. Объект не может наследоваться от двух других.
138+
Это вполне очевидно, но все же: может быть только один `[[Prototype]]`. Объект не может наследовать от двух других.
140139

141140
## Запись не использует прототип
142141

@@ -171,7 +170,7 @@ rabbit.walk(); // Rabbit! Bounce-bounce!
171170

172171
![](proto-animal-rabbit-walk-2.svg)
173172

174-
Это справедливо только для свойств данных, но не для аксессоров. Если свойство является геттером/сеттером, то оно ведёт себя как функция: геттеры/сеттеры ищутся в прототипе.
173+
Свойства-акссессоры - исключение, так как запись в него обрабатывается функцией-сеттером. То есть, это, фактически, вызов функции.
175174

176175
По этой причине `admin.fullName` работает корректно в приведённом ниже коде:
177176

@@ -208,13 +207,13 @@ admin.fullName = "Alice Cooper"; // (**)
208207

209208
Ответ прост: прототипы никак не влияют на `this`.
210209

211-
**Неважно, где находится метод: в объекте или его прототипе. В вызове метода, `this` — всегда объект перед точкой.**
210+
**Неважно, где находится метод: в объекте или его прототипе. При вызове метода `this` — всегда объект перед точкой.**
212211

213212
Таким образом, вызов сеттера `admin.fullName=` в качестве `this` использует `admin`, а не `user`.
214213

215-
Это на самом деле очень важная деталь, потому что у нас может быть большой объект со множеством методов, от которого можно унаследоваться. Затем наследуемые объекты могут выполнять его методы, и они будут изменять состояние этих объектов, а не большого.
214+
Это на самом деле очень важная деталь, потому что у нас может быть большой объект со множеством методов, от которого можно наследовать. Затем наследущие объекты могут вызывать его методы, но они будут изменять состояние этих объектов, а не большого.
216215

217-
Например, здесь `animal` представляет собой "хранилище метода", и `rabbit` использует его.
216+
Например, здесь `animal` представляет собой "хранилище методов", и `rabbit` использует его.
218217

219218
Вызов `rabbit.sleep()` устанавливает `this.isSleeping` для объекта `rabbit`:
220219

@@ -247,11 +246,11 @@ alert(animal.isSleeping); // undefined (нет такого свойства в
247246

248247
![](proto-animal-rabbit-walk-3.svg)
249248

250-
Если бы у нас были другие объекты, такие как `bird`, `snake` и т.д., унаследованные от `animal`, они также получили бы доступ к методам `animal`. Но `this` в каждом методе будет соответствовать объекту, на котором происходит вызов (до точки), а не `animal`. Поэтому, когда мы записываем данные в `this`, они сохраняются в этих объектах.
249+
Если бы у нас были другие объекты, такие как `bird`, `snake` и т.д., унаследованные от `animal`, они также получили бы доступ к методам `animal`. Но `this` при вызове каждого метода будет соответствовать объекту, на котором происходит вызов (перед точкой), а не `animal`. Поэтому, когда мы записываем данные в `this`, они сохраняются в этих объектах.
251250

252251
В результате методы являются общими, а состояние объекта — нет.
253252

254-
## Цикл for..in
253+
## Цикл for..in
255254

256255
Цикл `for..in` проходит не только во собственным, но и по унаследованным свойствам объекта.
257256

@@ -313,8 +312,8 @@ for(let prop in rabbit) {
313312

314313
Ответ простой: оно не перечислимо. То есть, у него внутренний флаг `enumerable` стоит `false`, как и у других свойств `Object.prototype`. Поэтому оно и не появляется в цикле.
315314

316-
```smart header="Все остальные перебирающие методы игнорируют унаследованные свойства"
317-
Все остальные методы, получающие ключи/значения, такие как `Object.keys`, `Object.values` и другие - игнорируют унаследованные свойства.
315+
```smart header="Почти все остальные методы получения ключей/значений игнорируют унаследованные свойства"
316+
Почти все остальные методы, получающие ключи/значения, такие как `Object.keys`, `Object.values` и другие - игнорируют унаследованные свойства.
318317
319318
Они учитывают только свойства самого объекта, не его прототипа.
320319
```
@@ -324,7 +323,7 @@ for(let prop in rabbit) {
324323
- В JavaScript все объекты имеют скрытое свойство `[[Prototype]]`, которое является либо другим объектом, либо `null`.
325324
- Мы можем использовать `obj.__ proto__` для доступа к нему (исторически обусловленный геттер/сеттер, есть другие способы, которые скоро будут рассмотрены).
326325
- Объект, на который ссылается `[[Prototype]]`, называется "прототипом".
327-
- Если мы хотим прочитать свойство `obj` или вызвать метод, которого не существует, тогда JavaScript попытается найти его в прототипе.
326+
- Если мы хотим прочитать свойство `obj` или вызвать метод, которого не существует, тогда JavaScript попытается найти его в прототипе.
328327
- Операции записи/удаления работают непосредственно с объектом, они не используют прототип (если это обычное свойство, а не не сеттер).
329328
- Если мы вызываем `obj.method()`, а метод взят из прототипа, то `this` все равно ссылается на `obj`. Таким образом, методы всегда работают с текущим объектом, даже если они наследуются.
330329
- Цикл `for..in` перебирает как свои, так и унаследованные свойства. Остальные методы получения ключей/значений работают только с самим объектом.

1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg

Lines changed: 1 addition & 1 deletion
Loading

images.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,6 @@ selection-direction-backward.svg:
344344
selection-direction-forward.svg:
345345
focus: 'фокус'
346346
anchor: 'якорь'
347+
348+
object-prototype-empty.svg:
349+
'prototype object': 'прототип object'

0 commit comments

Comments
 (0)