refactor types

This commit is contained in:
Ilya Kantor 2015-03-21 16:48:12 +03:00
parent 0712ddc698
commit c108f03596
10 changed files with 69 additions and 438 deletions

View file

@ -243,9 +243,7 @@ alert( pete.age ); // 25
С обычными свойствами в коде меньше букв, они удобны, причины использовать функции пока нет.
...Но рано или поздно может произойти что-то, что потребует более сложной логики.
Например, формат данных изменился и теперь вместо возраста `age` хранится дата рождения `birthday`:
...Но рано или поздно могут произойти изменения. Например, в `User` может стать более целесообразно вместо возраста `age` хранить дату рождения `birthday`:
```js
function User(name, birthday) {
@ -263,12 +261,13 @@ var pete = new User("Петя", new Date(1987, 6, 1));
Добавление `get`-функции `age` позволяет обойти проблему легко и непринуждённо:
```js
//+ run
//+ run no-beautify
function User(name, birthday) {
this.name = name;
this.birthday = birthday;
*!*
// age будет высчитывать возраст по birthday
Object.defineProperty(this, "age", {
get: function() {
var todayYear = new Date().getFullYear();
@ -280,10 +279,11 @@ function User(name, birthday) {
var pete = new User("Петя", new Date(1987, 6, 1));
alert( pete.age ); // получает возраст из даты рождения
alert( pete.birthday ); // и дата рождения доступна
alert( pete.age ); // и возраст
```
Таким образом, `defineProperty` позволяет нам использовать обычные свойства и, при необходимости, в любой момент заменить их на функции, сохраняя полную совместимость.
Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.
## Другие методы работы со свойствами

View file

@ -415,15 +415,9 @@ function mul(a, b) {
return a * b;
};
function ask(question, correctAnswer, ok, fail) {
var result;
if (typeof correctAnswer == 'boolean') {
result = confirm(question);
} else {
result = prompt(question, '');
}
if (result == correctAnswer) ok()
function ask(question, answer, ok, fail) {
var result = prompt(question, '');
if (result.toLowerCase() == answer.toLowerCase()) ok();
else fail();
}