From bc8be798f71f1b78e430f7f377ee305f550827b0 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Fri, 19 Jun 2015 18:41:06 +0300 Subject: [PATCH] fixes #32 and other --- .../14-types-conversion/article.md | 2 +- .../3-constructor-new/article.md | 35 ++++++++++++++++--- .../11-modifying-document/article.md | 4 +-- .../5-event-delegation/article.md | 2 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/1-js/2-first-steps/14-types-conversion/article.md b/1-js/2-first-steps/14-types-conversion/article.md index 3414aa35..3c7d44ab 100644 --- a/1-js/2-first-steps/14-types-conversion/article.md +++ b/1-js/2-first-steps/14-types-conversion/article.md @@ -89,7 +89,7 @@ alert( +false ); // 0 alert( "\n0 " == 0 ); // true ``` -При этом строка `"\n"` преобразуется к числу, как указано выше: начальные и конечные пробелы обрезаются, получается пустая строка `""`, которая равна `0`. +При этом строка `"\n0"` преобразуется к числу, как указано выше: начальные и конечные пробелы обрезаются, получается строка `"0"`, которая равна `0`.
  • С логическими значениями: diff --git a/1-js/6-objects-more/3-constructor-new/article.md b/1-js/6-objects-more/3-constructor-new/article.md index 608fc9af..f4ce62cf 100644 --- a/1-js/6-objects-more/3-constructor-new/article.md +++ b/1-js/6-objects-more/3-constructor-new/article.md @@ -3,6 +3,7 @@ Обычный синтаксис `{...}` позволяет создать один объект. Но зачастую нужно создать много однотипных объектов. Для этого используют "функции-конструкторы", запуская их при помощи специального оператора `new`. + [cut] ## Конструктор @@ -21,12 +22,14 @@ var animal = new Animal("ёжик"); */!* ``` -Технически, любую функцию можно вызвать при помощи `new`. Но при этом она работает несколько иным образом, чем обычно, поэтому функции, предназначенные к вызову через `new`, называют с большой буквы. +Заметим, что, технически, любая функция может быть использована как конструктор. То есть, любую функцию можно вызвать при помощи `new`. Как-то особым образом указывать, что она -- конструктор -- не надо. -**Алгоритм работы функции, запущенной через `new`:** +Но, чтобы выделить функции, задуманные как конструкторы, их называют с большой буквы: `Animal`, а не `animal`. + +Детальнее -- функция, запущенная через `new`, делает следующее:
      -
    1. Автоматически создается новый пустой объект.
    2. +
    3. Создаётся новый пустой объект.
    4. Ключевое слово `this` получает ссылку на этот объект.
    5. Функция выполняется. Как правило, она модифицирует `this`, добавляет методы, свойства.
    6. Возвращается `this`.
    7. @@ -47,7 +50,7 @@ animal = { ```js function Animal(name) { *!* - // this = {} + // this = {}; */!* // в this пишем свойства, методы @@ -55,11 +58,31 @@ function Animal(name) { this.canWalk = true; *!* - // return this + // return this; */!* } ``` +Теперь многократными вызовами `new Animal` с разными параметрами мы можем создать столько объектов, сколько нужно. Поэтому такую функцию и называют *конструктором* -- она предназначена для "конструирования" объектов. + +[smart header="new function() { ... }"] +Иногда функцию-конструктор объявляют и тут же используют, вот так: +```js +var animal = new function() { + this.name = "Васька"; + this.canWalk = true; +}; +``` +Так делают, когда хотят создать единственный объект данного типа. Примере выше с тем же успехом можно было бы переписать как: +```js +var animal = { + name: "Васька", + canWalk: true +} +``` +...Но обычный синтаксис `{...}` не подходит, когда при создании свойств объекта нужны более сложные вычисления. Их можно проделать в функции-конструкторе и записать результат в `this`. +[/smart] + ## Правила обработки return Как правило, конструкторы ничего не возвращают. Их задача -- записать всё, что нужно, в `this`, который автоматически станет результатом. @@ -176,6 +199,8 @@ vasya.sayHi(); // Привет, Вася Петров Те функции и данные, которые должны быть доступны для внешнего кода, мы пишем в `this` -- и к ним можно будет обращаться, как например `vasya.sayHi()`, а вспомогательные, которые нужны только внутри самого объекта, сохраняем в локальной области видимости. +[] + ## Итого Объекты могут быть созданы при помощи функций-конструкторов: diff --git a/2-ui/1-document/11-modifying-document/article.md b/2-ui/1-document/11-modifying-document/article.md index e964dd1b..d1cf7a43 100644 --- a/2-ui/1-document/11-modifying-document/article.md +++ b/2-ui/1-document/11-modifying-document/article.md @@ -213,9 +213,7 @@ parentElem.appendChild(elem) Конечно, можно сделать функцию для генерации сообщений и поместить туда этот код, но в ряде случаев гораздо эффективнее -- *клонировать* существующий `div`, а потом изменить текст внутри. В частности, если элемент большой, то клонировать его будет гораздо быстрее, чем пересоздавать. -Вызов `elem.cloneNode(true)` создаст "глубокую" копию элемента -- вместе с атрибутами, включая подэлементы. Если же вызвать с аргумнтом `false`, то он копия будет без подэлементов, но это нужно гораздо реже. - -### Копия сообщения +Вызов `elem.cloneNode(true)` создаст "глубокую" копию элемента -- вместе с атрибутами, включая подэлементы. Если же вызвать с аргументом `false`, то копия будет сделана без дочерних элементов. Это нужно гораздо реже. Пример со вставкой копии сообщения: diff --git a/2-ui/2-events-and-interfaces/5-event-delegation/article.md b/2-ui/2-events-and-interfaces/5-event-delegation/article.md index 7fcab35a..c35bd8b5 100644 --- a/2-ui/2-events-and-interfaces/5-event-delegation/article.md +++ b/2-ui/2-events-and-interfaces/5-event-delegation/article.md @@ -42,7 +42,7 @@ var selectedTd; *!* -table.onclick = function(event) { +table.onclick = function(event) { var target = event.target; // где был клик? if (target.tagName != 'TD') return; // не на TD? тогда не интересует