Цель: используйте ключевое слово class для создания класса Thermostat. Конструктор принимает температуру по Фаренгейту. В классе создайте геттер для получения температуры в градусах Цельсия и сеттер для установки температуры в градусах Цельсия.
Вот мой код:
class Thermostat {
constructor(fahrenheit){
this.fahrenheit = fahrenheit;
}
get temperature(){
const inCelcius = 5/9 * (this.fahrenheit - 32) ;
return inCelcius;
}
set temperature (temperatureInCelcius){
this.fahrenheit = temperatureInCelcius;
}
}
const thermos = new Thermostat(76); // Setting in Fahrenheit scale
let temp = thermos.temperature; // should show 24.44 in Celsius
console.info(temp);
thermos.temperature = 26;
temp = thermos.temperature; // should show 26 in Celsius but right now showing -3.333
console.info(temp);
Я знаю, что правильное решение — заменить this.fahrenheit = temperatureInCelcius;
на this.fahrenheit = (celsius * 9.0) / 5 + 32;
Но я не понимаю, почему. Мне сказали, что в моем коде отсутствует преобразование.
Мои вопросы:
thermos.temperature = 26;
Насколько я понимаю, когда компилятор видит эту строку, он вызывает эту строку внутри конструктора.set temperature (temperatureInCelcius){
this.fahrenheit = temperatureInCelcius;
}
а затем введите 26 в аргумент (temperatureInCelcius)
, затем установите значение свойства this.fahrenheit
равным 26.
Просто хочу какое-то объяснение, потому что мне кажется, что я что-то упускаю. Был бы очень признателен за вашу помощь! <3
this.fahrenheit = temperatureInCelcius
показывает плохой выбор имен переменных. Это означает, что входящая температура (в мировых единицах) преобразуется в этот момент в единицы свободы, что не так.
@tkausl Большое спасибо за объяснение. Можете ли вы рассказать мне больше о части чтения и письма?
Я думал, что сеттер просто удалит текущее значение this.fahrenheit и перезапишет его на 26? Разве это не так?
правильно ... так что теперь ваше значение по Фаренгейту - это число 26
- и когда вы get
temperature
оно преобразует 26 градусов по Фаренгейту в соответствующие градусы Цельсия
вам нужно преобразовать входящее значение celcius
в fahrenheit
, прежде чем сохранить его в this.fahrenheit
Не знаю, как я помог. Я думаю, вы знали, что должны были это сделать, вы так сказали в вопросе, вам нужно было знать, почему? Почему-то мой комментарий заставил что-то щелкнуть :p
@bravo Я не учел тот факт, что когда вы получаете температуру после ее установки, она снова проходит преобразование. Когда вы сказали, что «когда вы получаете температуру, она преобразует 26 градусов по Фаренгейту в соответствующие градусы Цельсия», это было для меня именно тогда! :D Между прочим, ты стал отличным учителем.
Когда вы делаете temp = thermos.temperature;
, вызывается get temperature()
и для thermos.temperature = 26;
вызывается set temperature()
.
// thermos.temperature = 76
const thermos = new Thermostat(76);
// this calls get temperature() and return 24.44
// 5/9 * (76 - 32) = 24.44
let temp = thermos.temperature;
console.info(temp); // 24.44
// this calls set temperature() and sets thermos.temperature = 26
thermos.temperature = 26;
// this calls get temperature() and return -3.333
// 5/9 * (26 - 32) = -3.333
temp = thermos.temperature;
console.info(temp); // -3.33
Вы конвертируете фаренгейты -> градусы Цельсия при чтении, поэтому вам нужно конвертировать градусы Цельсия -> фаренгейты при записи.
2: My understanding is that
Это не конструктор, иначе все правильно.I know the correct solution is to change this.fahrenheit = temperatureInCelcius;
Да, потому что вы сохраняете цельсия в своей переменной, которая должна содержать значение фаренгейт.