fixes, renovations

This commit is contained in:
Ilya Kantor 2015-03-24 00:03:51 +03:00
parent 3889056599
commit bc34b2fc9d
133 changed files with 189 additions and 10 deletions

View file

@ -129,8 +129,9 @@ alert( +new Date() ); // valueOf: кол-во миллисекунд, проше
## Две стадии преобразования
Итак, объект преобразован в примитив при помощи `toString` или `valueOf`. Далее, вполне возможно,
Если необходимо, что полученный из объекта примитив будет преобразован дальше, уже по правилам для примитивов.
Итак, объект преобразован в примитив при помощи `toString` или `valueOf`.
Но на этом преобразования не обязательно заканчиваются. Вполне возможно, что в процессе вычислений этот примитив будет преобразован во что-то другое.
Например, рассмотрим применение к объекту операции `==`:
@ -177,22 +178,28 @@ var b = {
}
};
alert( a + b ); // "12"
alert( a - b ); // "1" - "2" = -1
```
[warn header="Исключение: `Date`"]
Объект `Date`, по историческим причинам, является исключением.
Бинарный оператор плюс `+` обычно использует числовое преобразование, но в случае с `Date` -- строковое:
Бинарный оператор плюс `+` обычно использует числовое преобразование и метод `valueOf`. Как мы уже знаем, если подходящего `valueOf` нет (а его нет у большинства объектов), то используется `toString`, так что в итоге преобразование происходит к строке. Но если есть `valueOf`, то используется `valueOf`. Выше в примере как раз `a + b` это демонстрируют.
У объектов `Date` есть и `valueOf` и `toString`. Но оператор `+` для `Date` использует именно `toString` (хотя должен бы `valueOf`).
Это и есть исключение:
```js
//+ run
// бинарный вариант, строчное преобразование
// бинарный плюс, строчное преобразование
alert( new Date + "" ); // "строка даты"
// унарный вариант, как и - * /, приводит к числу
// унарный плюс, как и - * /, приводит к числу
alert( +new Date ); // число миллисекунд
```
Других подобных исключений нет.
[/warn]
[warn header="Как испугать Java-разработчика"]

View file

@ -2,7 +2,7 @@
[importance 5]
Напишите *функцию-конструктор* `Calculator`, которая создает объект с двумя методами:
Напишите *функцию-конструктор* `Calculator`, которая создает объект с тремя методами:
<ul>
<li>Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.</li>
<li>Метод `sum()` возвращает сумму запомненных свойств.</li>

View file

@ -283,6 +283,8 @@ alert( pete.birthday ); // и дата рождения доступна
alert( pete.age ); // и возраст
```
Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно.
Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.
## Другие методы работы со свойствами