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/2-first-steps/14-types-conversion/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -89,7 +89,7 @@ alert( +false ); // 0
89
89
alert( "\n0 "==0 ); // true
90
90
```
91
91
92
-
При этом строка `"\n"` преобразуется к числу, как указано выше: начальные и конечные пробелы обрезаются, получается пустая строка `""`, которая равна `0`.</li>
92
+
При этом строка `"\n0"` преобразуется к числу, как указано выше: начальные и конечные пробелы обрезаются, получается строка `"0"`, которая равна `0`.</li>
Copy file name to clipboardExpand all lines: 1-js/6-objects-more/3-constructor-new/article.md
+30-5Lines changed: 30 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,6 +3,7 @@
3
3
Обычный синтаксис `{...}` позволяет создать один объект. Но зачастую нужно создать много однотипных объектов.
4
4
5
5
Для этого используют "функции-конструкторы", запуская их при помощи специального оператора `new`.
6
+
6
7
[cut]
7
8
## Конструктор
8
9
@@ -21,12 +22,14 @@ var animal = new Animal("ёжик");
21
22
*/!*
22
23
```
23
24
24
-
Технически, любую функцию можно вызвать при помощи `new`. Но при этом она работает несколько иным образом, чем обычно, поэтому функции, предназначенные к вызову через `new`, называют с большой буквы.
25
+
Заметим, что, технически, любая функция может быть использована как конструктор. То есть, любую функцию можно вызвать при помощи `new`. Как-то особым образом указывать, что она -- конструктор -- не надо.
26
+
27
+
Но, чтобы выделить функции, задуманные как конструкторы, их называют с большой буквы: `Animal`, а не `animal`.
25
28
26
-
**Алгоритм работы функции, запущенной через `new`:**
29
+
Детальнее -- функция, запущенная через `new`, делает следующее:
27
30
28
31
<ol>
29
-
<li>Автоматически создается новый пустой объект.</li>
32
+
<li>Создаётся новый пустой объект.</li>
30
33
<li>Ключевое слово `this` получает ссылку на этот объект.</li>
31
34
<li>Функция выполняется. Как правило, она модифицирует `this`, добавляет методы, свойства.</li>
32
35
<li>Возвращается `this`.</li>
@@ -47,19 +50,39 @@ animal = {
47
50
```js
48
51
functionAnimal(name) {
49
52
*!*
50
-
// this = {}
53
+
// this = {};
51
54
*/!*
52
55
53
56
// в this пишем свойства, методы
54
57
this.name= name;
55
58
this.canWalk=true;
56
59
57
60
*!*
58
-
// return this
61
+
// return this;
59
62
*/!*
60
63
}
61
64
```
62
65
66
+
Теперь многократными вызовами `new Animal` с разными параметрами мы можем создать столько объектов, сколько нужно. Поэтому такую функцию и называют *конструктором* -- она предназначена для "конструирования" объектов.
67
+
68
+
[smart header="new function() { ... }"]
69
+
Иногда функцию-конструктор объявляют и тут же используют, вот так:
70
+
```js
71
+
var animal =newfunction() {
72
+
this.name="Васька";
73
+
this.canWalk=true;
74
+
};
75
+
```
76
+
Так делают, когда хотят создать единственный объект данного типа. Примере выше с тем же успехом можно было бы переписать как:
77
+
```js
78
+
var animal = {
79
+
name:"Васька",
80
+
canWalk:true
81
+
}
82
+
```
83
+
...Но обычный синтаксис `{...}` не подходит, когда при создании свойств объекта нужны более сложные вычисления. Их можно проделать в функции-конструкторе и записать результат в `this`.
84
+
[/smart]
85
+
63
86
## Правила обработки return
64
87
65
88
Как правило, конструкторы ничего не возвращают. Их задача -- записать всё, что нужно, в `this`, который автоматически станет результатом.
@@ -176,6 +199,8 @@ vasya.sayHi(); // Привет, Вася Петров
176
199
177
200
Те функции и данные, которые должны быть доступны для внешнего кода, мы пишем в `this` -- и к ним можно будет обращаться, как например `vasya.sayHi()`, а вспомогательные, которые нужны только внутри самого объекта, сохраняем в локальной области видимости.
178
201
202
+
[]
203
+
179
204
## Итого
180
205
181
206
Объекты могут быть созданы при помощи функций-конструкторов:
Copy file name to clipboardExpand all lines: 2-ui/1-document/11-modifying-document/article.md
+1-3Lines changed: 1 addition & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -213,9 +213,7 @@ parentElem.appendChild(elem)
213
213
214
214
Конечно, можно сделать функцию для генерации сообщений и поместить туда этот код, но в ряде случаев гораздо эффективнее -- *клонировать* существующий `div`, а потом изменить текст внутри. В частности, если элемент большой, то клонировать его будет гораздо быстрее, чем пересоздавать.
215
215
216
-
Вызов `elem.cloneNode(true)` создаст "глубокую" копию элемента -- вместе с атрибутами, включая подэлементы. Если же вызвать с аргумнтом `false`, то он копия будет без подэлементов, но это нужно гораздо реже.
217
-
218
-
### Копия сообщения
216
+
Вызов `elem.cloneNode(true)` создаст "глубокую" копию элемента -- вместе с атрибутами, включая подэлементы. Если же вызвать с аргументом `false`, то копия будет сделана без дочерних элементов. Это нужно гораздо реже.
0 commit comments