Если вы хотите использовать его после создания объекта, ваша локальная переменная timer
должна вместо этого быть свойством, поэтому в конструкторе замените
var timer = document.getElementById('timer');
на
this.timer = document.getElementById('timer');
Затем в start
вам также необходимо использовать this.timer
- и это означает, что вы хотите использовать функцию стрелки , а не традиционную функцию, для обратного вызова setInterval
, чтобыфункция закрывается на this
.Возможно, вы захотите использовать this.currTimer
напрямую, а не копировать его в переменную:
this.runTimer = setInterval(() => {
this.timer.innerHTML = ++this.currTimer;
},1000);
Логика там также нуждается в настройке: вы только что присвоили true
this.isRunning
, так что в этом нет необходимости.чтобы проверить это потом.Но на самом деле, вы хотите проверить это заранее:
start(){
if (!this.isRunning) {
this.isRunning = true;
this.runTimer = setInterval(() => {
this.timer.innerHTML = ++this.currTimer;
},1000);
}
}
Вам также нужно использовать ==
или ===
, а не =
, при выполнении сравнений, подобных этому:
if (this.isRunning = false) { // Needs == or ===
Но логика в pause
имеет проблему: вы только что установили this.isRunning
на false
, поэтому, проверяя его на следующей строке, оно всегда будет ложным.Вместо этого проверьте его, прежде чем назначить на него.Кроме того, используйте if (flag)
или if (!flag)
вместо == true
или == false
:
pause(){
if (this.isRunning) {
clearInterval(this.runTimer)
this.isRunning = false;
}
}
Кажется, чтобы работать с этими изменениями:
class Timer {
constructor() {
this.isRunning = false;
this.currTimer = 0;
this.runTimer;
this.timer = document.getElementById('timer');
}
start() {
if (!this.isRunning) {
this.isRunning = true;
this.runTimer = setInterval(() => {
this.timer.innerHTML = ++this.currTimer;
}, 1000);
}
}
pause() {
if (this.isRunning) {
clearInterval(this.runTimer);
this.isRunning = false;
}
}
}
var test = new Timer();
test.start();
setTimeout(function() {
test.pause(); // put this after a few seconds
}, 4000);
<div id="timer"></div>
Я также настоятельно рекомендую использовать ;
постоянно (например, после вызова setInterval
).JavaScript имеет автоматическую вставку точек с запятой (ASI), поэтому он будет действовать так, как будто вы включили точки с запятой в некоторых местах, даже если у вас их нет, но вы не можете на это полагаться, если у вас нет очень полного понимания ASIправила.