Эта проблема меня ооочень сильно беспокоит. Я уверен, что на этот вопрос был дан ответ, но я в растерянности, так как искал около получаса.
Вот моя проблема:
В Javascript я создал класс Game.
В настоящее время класс выглядит так:
class Game {
this.test = "";
this.number = 0;
constructor()
{
this.cWidth = 480;
this.cHeight = 360;
this.i = 0;
}
run()
{
var human = new User(192,175);
var bot1 = new Bot(339,92);
var bot2 = new Bot(352,255);
setInterval(this.updateGameArea, 1000 / 60);
}
updateGameArea()
{
this.clear();
this.update();
}
clear()
{
ctx.clearRect(0,0,this.cWidth,this.cHeight);
ctx.fillStyle = "#FFFFFF"
console.info("cleared! cwidth = " + this.cWidth + "; cHeight = " + this.cHeight);
}
update()
{
var pos = getCoords();
drawMousePos();
return;
}
}
Game game = new game();
game.run();
Обратите внимание, что этот класс также запускается внутри JQuery $(document).ready(function(){}), но должен работать, поскольку работают другие, более простые классы.
У меня несколько проблем:
test и number выдают синтаксические ошибки, говоря, что game.js:161 Uncaught SyntaxError: Unexpected token .Согласно Страница синтаксиса класса Mozilla, кажется, что можно создавать экземпляры переменных с помощью ключевого слова this без конструктора.
В updateGameArea() нельзя ссылаться на clear() и update(). Однако в run() они могут. Мне удалось обойти это, установив clear() и update() в статическое состояние и вызвав их с помощью Game.update() и Game.clear(), но я бы предпочел, чтобы я мог сделать это правильно.
Переменные cWidth и cHeight НЕ содержат своих значений. Когда я тестировал clear(), когда он был статическим, cWidth и cHeight оба не были определены.
Любая помощь очень ценится.
test, number, cWidth и cHeight не являются «переменными», это поля экземпляра. Переменные объявляются с помощью var и let, что дает им возможность быть доступными внутри. Члены this.Xyz привязаны к конкретному экземпляру класса и не могут работать в разных экземплярах.
Game game = new game(); действительно должен быть чем-то вроде const game = new Game();"Согласно странице синтаксиса класса Mozilla, кажется, что можно создавать экземпляры переменных с помощью ключевого слова this без конструктора." - нет, где вы это читаете?
Спасибо за помощь. Я ошибся в одном из примеров, когда переменная была создана с использованием ключевого слова this INSIDE функции внутри класса.
«Переменные» никогда не «инстанцируются» (они «инициализируются» - создаются экземпляры объектов), и если перед ними стоит this, они не являются переменными, это поля экземпляра.
Понятно. Спасибо за исправление.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


this.test = ""; this.number = 0;должен находиться внутриconstructor. В противном случае это недопустимый JavaScript. ТакжеsetInterval(this.updateGameArea.bind(this), ...)илиsetInterval(() => this.updateGameArea(), ...)для сохранения контекста вызова.