Я пытаюсь обернуть голову вокруг Javascript и хочу создать простой веб-апплет, который можно включать и отключать с помощью кнопок, и, когда он включен, рисует вещи.Чтобы написать чистый (er) код, я хотел использовать объект для этого.Настройка страницы с кнопками -
<div>
<input type="button" name="runbutton" value="Run" onclick="game.run();"/>
<input type="button" name="resetbutton" value="Reset" onclick="game.reset();"/>
</div>
<script>
//...
</script>
, а код javascript -
function Game() {
this.runs = false;
this.run = function() {console.log('run...'); this.runs = true;};
this.reset = function() {console.log('reset...'); this.runs = false;};
this.update = function() {console.log('updating... runs:', this.runs);};
};
var game = new Game();
game.reset();
setInterval(game.update, 300);
Таким образом, это определение объекта (Game) с одним экземпляром (game) с одним логическим значениемсвойство (прогоны) и три метода.Тот, который запускает его, тот, который перестает работать, и метод update (), который сообщает, выполняется ли он.Функция update () повторяется каждые 300 мс с использованием setInterval.
Проблема : журналы консоли из update () сообщают значение this.runs как неопределенное, а не как false или true.Когда я открываю консоль и ставлю ее на паузу, чтобы проверить переменные, она сообщает game.runs как false или true.Кроме того, когда я добавляю вызовы console.log () в run () и reset (), сообщая о значении this.runs до и после его установки, кажется, что он сообщает true и false правильно.Таким образом, проблема, кажется, где-то в update ().Это как если бы он использовал неправильное «это».Может быть, setInterval нельзя использовать в методах?
Я пробовал два других синтаксиса для кода, но они, похоже, имеют ту же самую проблему:
var game = {
runs: false,
run: function() {console.log('run...'); this.runs = true;},
reset: function() {console.log('reset...'); this.runs = false;},
update: function() {console.log('update... runs:', this.runs);}
};
game.reset();
setInterval(game.update, 300);
и версию, которая устанавливает setInterval в пределахобъект:
var game = {
runs: false,
i: undefined,
run: function() {console.log('run...'); this.runs = true; this.i = setInterval(this.update, 300);},
reset: function() {console.log('reset...'); this.runs = false; clearInterval(this.i);},
update: function() {console.log('update... runs:', this.runs);}
};
game.reset();
Та же проблема.
Что происходит?Почему update () сообщает об этом .runs как неопределенном?Правильно ли я понимаю, что «this» в методах действительно относится к экземпляру игры во всех случаях?Разве я не должен использовать setInterval для метода и вместо этого вызывать глобальную функцию?