Итак, у меня есть конструктор для заставки. Я использую холст-графику (ctx ниже - ссылка на 2d-контекст элемента canvas), но кажется, когда я пытаюсь получить локальную копию контекста, который я потерял. Кто-то имеет представление о том, почему он становится неопределенным, где он (см ниже)Конструктор Javascript, кажется, теряет данные
function SplashScreen(_ctx)
{
this.loadScene = function()
{
this.img = new Image();
this.img.onload = this.render;
this.img.src = 'art/SplashScreen.png';
};
this.unloadScene = function()
{
delete this.img;
this.img = null;
CollectGarbage();
};
this.render = function()
{
alert(this.ctx);//<--------------undefined
alert(this.img);//<--------------undefined
this.ctx.drawImage(this.img,0,0);
};
alert(_ctx); //<--------------properly defined
this.ctx = _ctx;
alert(this.ctx);//<--------------properly defined
return this;
}
Вот где я звоню SplashScreen (примечание: ниже от main.js и выше в SplashScreen. JS):
var ctx;
var scene_Splash;
var currentScene;
function main()
{
ctx = document.getElementById('canvas').getContext('2d');
alert(ctx); //<-------fine and defined
scene_Splash = new SplashScreen(ctx);
changeScene(scene_Splash, null, null);
}
function changeScene(_newScene, _transition, _time)
{
currentScene = _newScene;
currentScene.loadScene();
}
Расширяя еще дальше, вот часть файла index.html, который ссылающегося эти сценарии:
<html>
<head>
<script language="JavaScript" type="text/javascript" src="splashscreen.js"></script>
<script language="JavaScript" type="text/javascript" src="main.js"></script>
</head>
<body onload="main()">
<canvas id="canvas" width="640" height="960"></canvas>
</body>
</html>
Вы, кажется, делаете некоторые неправильные предположения о том, как 'this' работает в JS. Первое, что нужно знать, - это то, что «это» не имеет ничего общего с областью переменных и мало связано с наследованием. Это целиком связано с * как * вызывается конкретная функция. –
Вы должны заглянуть в свойство prototype конструктора, который является местом для определения ваших методов. Так же, как и сейчас, вы можете использовать регулярную функцию, которая возвращает литерал немого объекта. – Esailija
... Другими словами, вы должны показать * how *, что вы вызываете 'SplashScreen', а также локально определенные методы, поскольку это имеет значение. –