update
This commit is contained in:
parent
962caebbb7
commit
87bf53d076
1825 changed files with 94929 additions and 0 deletions
66
1-js/8-oop/3-getters-setters/4-setter-onready/solution.md
Normal file
66
1-js/8-oop/3-getters-setters/4-setter-onready/solution.md
Normal file
|
@ -0,0 +1,66 @@
|
|||
|
||||
|
||||
```js
|
||||
//+ run
|
||||
function CoffeeMachine(power, capacity) {
|
||||
var waterAmount = 0;
|
||||
|
||||
var WATER_HEAT_CAPACITY = 4200;
|
||||
function getTimeToBoil() {
|
||||
return waterAmount * WATER_HEAT_CAPACITY * 80 / power;
|
||||
}
|
||||
|
||||
this.setWaterAmount = function(amount) {
|
||||
// ... проверки пропущены для краткости
|
||||
waterAmount = amount;
|
||||
};
|
||||
|
||||
this.getWaterAmount = function(amount) {
|
||||
return waterAmount;
|
||||
};
|
||||
|
||||
function onReady() {
|
||||
alert('Кофе готов!');
|
||||
}
|
||||
|
||||
*!*
|
||||
this.setOnReady = function(newOnReady) {
|
||||
onReady = newOnReady;
|
||||
};
|
||||
*/!*
|
||||
|
||||
this.run = function() {
|
||||
*!*
|
||||
setTimeout(function() { onReady(); }, getTimeToBoil());
|
||||
*/!*
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
var coffeeMachine = new CoffeeMachine(20000, 500);
|
||||
coffeeMachine.setWaterAmount(150);
|
||||
|
||||
coffeeMachine.run();
|
||||
|
||||
*!*
|
||||
coffeeMachine.setOnReady(function() {
|
||||
var amount = coffeeMachine.getWaterAmount();
|
||||
alert('Готов кофе: ' + amount + 'мл'); // Готов кофе: 150 мл
|
||||
});
|
||||
*/!*
|
||||
```
|
||||
|
||||
Обратите внимание на два момента в решении:
|
||||
<ol>
|
||||
<li>В сеттере `setOnReady` параметр называется `newOnReady`. Мы не можем назвать его `onReady`, так как тогда изнутри сеттера мы никак не доберёмся до внешнего (старого значения):
|
||||
|
||||
```js
|
||||
// нерабочий вариант
|
||||
this.setOnReady = function(onReady) {
|
||||
onReady = onReady; // ??? внешняя переменная onReady недоступна
|
||||
};
|
||||
```
|
||||
|
||||
</li>
|
||||
<li>Чтобы `setOnReady` можно было вызывать в любое время, в `setTimeout` передаётся не `onReady`, а анонимная функция `function() { onReady() }`, которая возьмёт текущий (установленный последним) `onReady` из замыкания.</li>
|
||||
</ol>
|
58
1-js/8-oop/3-getters-setters/4-setter-onready/task.md
Normal file
58
1-js/8-oop/3-getters-setters/4-setter-onready/task.md
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Создать сеттер для onReady
|
||||
|
||||
[importance 5]
|
||||
|
||||
Обычно когда кофе готов, мы хотим что-то сделать, например выпить его.
|
||||
|
||||
Сейчас при готовности срабатывает функция `onReady`, но она жёстко задана в коде:
|
||||
|
||||
```js
|
||||
function CoffeeMachine(power, capacity) {
|
||||
var waterAmount = 0;
|
||||
|
||||
var WATER_HEAT_CAPACITY = 4200;
|
||||
function getTimeToBoil() {
|
||||
return waterAmount * WATER_HEAT_CAPACITY * 80 / power;
|
||||
}
|
||||
|
||||
this.setWaterAmount = function(amount) {
|
||||
// ... проверки пропущены для краткости
|
||||
waterAmount = amount;
|
||||
};
|
||||
|
||||
this.getWaterAmount = function(amount) {
|
||||
return waterAmount;
|
||||
};
|
||||
|
||||
*!*
|
||||
function onReady() {
|
||||
alert('Кофе готов!');
|
||||
}
|
||||
*/!*
|
||||
|
||||
this.run = function() {
|
||||
setTimeout(onReady, getTimeToBoil());
|
||||
};
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
Создайте сеттер `setOnReady`, чтобы код снаружи мог назначить свой `onReady`, вот так:
|
||||
|
||||
```js
|
||||
var coffeeMachine = new CoffeeMachine(20000, 500);
|
||||
coffeeMachine.setWaterAmount(150);
|
||||
|
||||
*!*
|
||||
coffeeMachine.setOnReady(function() {
|
||||
var amount = coffeeMachine.getWaterAmount();
|
||||
alert('Готов кофе: ' + amount + 'мл'); // Кофе готов: 150 мл
|
||||
});
|
||||
*/!*
|
||||
|
||||
coffeeMachine.run();
|
||||
```
|
||||
|
||||
P.S. Значение `onReady` по умолчанию должно быть таким же, как и раньше.
|
||||
|
||||
P.P.S. Постарайтесь сделать так, чтобы `setOnReady` можно было вызвать не только до, но и *после* запуска кофеварки, то есть чтобы функцию `onReady` можно было изменить в любой момент до её срабатывания.
|
Loading…
Add table
Add a link
Reference in a new issue