|
1 | 1 | ## Конструктор
|
2 | 2 |
|
3 |
| -Создание конструкторов в JavaScript также отличается от большинства других языков. Любая функция, вызванная с использованием ключевого слова `new`, будет конструктором. |
| 3 | + Конструкторы в JavaScript тоже действуют отличным от большинства других языков образом. Любая функция, вызванная с использованием ключевого слова `new`, станет конструктором. |
4 | 4 |
|
5 |
| -Внутри конструктора (вызываемой функции) `this` будет указывать на новосозданный `Object`. [Прототипом](#object.prototype) этого **нового** объекта будет `prototype` функции, которая была вызвана в качестве коструктора. |
| 5 | +Внутри конструктора (вызываемой функции) `this` будет указывать на новосозданный `Object`. [Прототипом](#object.prototype) этого **нового** экземпляра будет `prototype` функции, которая была вызвана под видом конструктора. |
6 | 6 |
|
7 |
| -Если вызываемая функция не имеет явного возврата посредством `return`, то вернётся `this` — этот новый объект. |
| 7 | +Если вызываемая функция не возвращает явного значения посредством `return`, то она автоматически вернёт `this` — тот самый новый экземпляр. |
8 | 8 |
|
9 | 9 | function Foo() {
|
10 | 10 | this.bla = 1;
|
|
18 | 18 |
|
19 | 19 | В этом примере `Foo` вызывается в виде конструктора, следовательно прототип созданного объекта будет привязан к `Foo.prototype`.
|
20 | 20 |
|
21 |
| -В случае, когда функция в явном виде возвращает некое значение используя `return`, то в результате выполнения конструктора мы получим именно его, **но только** если возвращаемое значение представляет собой `Object`. |
| 21 | +В случае, когда функция в явном виде возвращает некое значение используя `return`, в результате выполнения конструктора мы получим именно его, **но только** если возвращаемое значение представляет собой `Object`. |
22 | 22 |
|
23 | 23 | function Bar() {
|
24 | 24 | return 2;
|
|
37 | 37 | Если же опустить ключевое слово `new`, то функция **не** будет возвращать никаких объектов.
|
38 | 38 |
|
39 | 39 | function Foo() {
|
40 |
| - this.bla = 1; // устанавливается глобальному объекту |
| 40 | + this.bla = 1; // свойство bla устанавливается глобальному объекту |
41 | 41 | }
|
42 |
| - Foo(); // undefined |
| 42 | + Foo(); // возвращает undefined |
43 | 43 |
|
44 |
| -Этот пример в некоторых случаях всё-таки может сработать: это связано с поведением [`this`](#function.this) в JavaScript — он будет восприниматься парсером как *глобальный объект*. |
| 44 | +Хотя этот пример и будет работать — в связи с поведением [`this`](#function.this) в JavaScript, значение будет присвоено *глобальному объекту* — навряд ли это предполагалось автором. |
45 | 45 |
|
46 | 46 | ### Фабрики
|
47 | 47 |
|
48 |
| -Если хотите избавится от необходимости использования `new`, напишите конструктор, возвращающий значение посредством `return`. |
| 48 | +Если вы хотите предоставить возможность опускать оператор `new` при создании объектов, возвращайте из соответствующего конструктора явное значение посредством `return`. |
49 | 49 |
|
50 | 50 | function Bar() {
|
51 | 51 | var value = 1;
|
|
62 | 62 | new Bar();
|
63 | 63 | Bar();
|
64 | 64 |
|
65 |
| -В обоих случаях при вызове `Bar` мы получим один и тот же результат — новый объект со свойством `method` (спасибо [замыканию](#function.closures) за это). |
| 65 | +В обоих случаях при вызове `Bar` мы получим один и тот же результат — новый объект со свойством `method`, являющимся [замыканием](#function.closures)). |
66 | 66 |
|
67 |
| -Также следует заметить, что вызов `new Bar()` никак **не** связан с прототипом возвращаемого объекта. Хоть прототип и назначается всем новосозданным объектам, но `Bar` никогда не возвращает этот новый объект. |
| 67 | +Ещё следует заметить, что вызов `new Bar()` никак **не** воздействует на прототип возвращаемого объекта. Хоть прототип и назначается всем новосозданным объектам, `Bar` никогда не возвращает этот новый объект (''прим. перев.'' — судя по всему, подразумевается, что код `Bar` не может влиять на прототип созданного объекта, и под словами «новый объект» в последнем случае кроется прототип нового объекта, а не сам новый объект). |
68 | 68 |
|
69 |
| -В предыдущем примере нет функциональных отличий между вызовом конструктора с оператором `new` или без него. |
| 69 | +В предыдущем примере нет никаких функциональных различий между вызовом конструктора с оператором `new` и вызовом без него. |
70 | 70 |
|
71 | 71 | ### Создание объектов с использованием фабрик
|
72 | 72 |
|
73 |
| -Часто рекомендуют **не** использовать `new`, поскольку если вы его забудете, это может привести к ошибкам. |
| 73 | +Нередко встречаются советы **не** использовать оператор `new`, поскольку если вы его забудете, это может привести к ошибкам. |
74 | 74 |
|
75 |
| -Чтобы создать новый объект, лучше использовать фабрику и создать новый объект *внутри* этой фабрики. |
| 75 | +Чтобы создать новый объект, нам предлагают использовать фабрику и создать новый объект *внутри* этой фабрики. |
76 | 76 |
|
77 | 77 | function Foo() {
|
78 | 78 | var obj = {};
|
|
89 | 89 | return obj;
|
90 | 90 | }
|
91 | 91 |
|
92 |
| -Хотя данный пример и сработает, если вы забыли ключевое слово `new` и благодаря ему легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков |
| 92 | +Хотя данный пример и сработает, если вы забыли ключевое слово `new` и, возможно, благодаря ему вам станет легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков: |
93 | 93 |
|
94 | 94 | 1. Он использует больше памяти, поскольку созданные объекты **не** хранят методы в прототипе и соответственно для каждого нового объекта создаётся копия каждого метода.
|
95 | 95 | 2. Чтобы эмулировать наследование, фабрике нужно скопировать все методы из другого объекта или установить прототипом нового объекта старый.
|
96 |
| - 3. Разрыв цепочки прототипов просто по причине забытого ключевого слова `new` идёт в разрез с духом языка. |
| 96 | + 3. Разрыв цепочки прототипов по мнимой необходимости избавиться от использования ключевого слова `new` идёт вразрез с духом языка. |
97 | 97 |
|
98 | 98 | ### Заключение
|
99 | 99 |
|
100 |
| -Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить какой из способов лучше совпадает с требованиями приложения: очень важно выбрать один из стилей создания объектов и после этого **не изменять** ему. |
| 100 | +Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить какой из способов лучше совпадает с требованиями приложения: крайне важно выбрать один из стилей создания объектов и после этого **не изменять** ему. |
101 | 101 |
|
0 commit comments