类中的JavaScript对象是';未定义';
我下面有一个类,它控制着一个小的HTML5游戏。您将在startName方法中看到几行,一个对象被保存到一个名为keys的属性中,这是keys类的一个实例 在此之后,我调用该类中另一个名为setEventHandlers的方法。理论上,这应该设置调用回调的处理程序,回调将数据发送到keys对象(存储为属性) 每当调用类中的JavaScript对象是';未定义';,javascript,html,oop,prototype,Javascript,Html,Oop,Prototype,我下面有一个类,它控制着一个小的HTML5游戏。您将在startName方法中看到几行,一个对象被保存到一个名为keys的属性中,这是keys类的一个实例 在此之后,我调用该类中另一个名为setEventHandlers的方法。理论上,这应该设置调用回调的处理程序,回调将数据发送到keys对象(存储为属性) 每当调用this.keys.keyDown或this.keys.keydup时,它表示“keys”未定义 我似乎不明白为什么会发生这种情况,这似乎与执行顺序有关。有什么想法吗?提前谢谢 fu
this.keys.keyDown
或this.keys.keydup
时,它表示“keys”未定义
我似乎不明白为什么会发生这种情况,这似乎与执行顺序有关。有什么想法吗?提前谢谢
function Game() {
this.startGame();
}
Game.prototype.startGame = function () {
this.canvasElement = document.createElement("canvas");
this.canvasContext = this.canvasElement.getContext("2d");
document.body.appendChild(this.canvasElement);
this.canvasElement.width = window.innerWidth;
this.canvasElement.height = window.innerHeight;
this.keys = new Keys();
this.mouse = new Mouse();
this.player = new Player(this.randomPosition().x, this.randomPosition().y);
this.setEventHandlers();
};
Game.prototype.setEventHandlers = function () {
var onKeyDown = function (e) {
this.keys.keyDown(e.keyCode);
},
onKeyUp = function (e) {
this.keys.keyUp(e.keyCode);
},
onMouseMove = function (e) {
// this.mouse.move(e.x, e.y);
},
onMouseClick = function (e) {
// this.mouse.click(e.x, e.y);
},
onWindowResize = function () {
this.canvasElement.width = window.innerWidth;
this.canvasElement.height = window.innerHeight;
};
// Keyboard events
window.addEventListener("keydown", onKeyDown, false);
window.addEventListener("keyup", onKeyUp, false);
// Mouse events
window.addEventListener("mousemove", onMouseMove, false);
window.addEventListener("click", onMouseClick, false);
// Window events
window.addEventListener("resize", onWindowResize, false);
};
Game.prototype.randomPosition = function () {
var randomX = Math.round(Math.random() * this.canvasElement.width),
randomY = Math.round(Math.random() * this.canvasElement.height);
return { x: randomX, y: randomY };
};
上面的代码创建了一个新函数,因此“this”指的是它自己,而不是游戏对象
试一试
在你的一个处理程序中记录
这个,看看它是什么。@jskidd3:我说过你是吗?仅仅因为你没有在搜索中找到它并不意味着它不是一个重复的问题。把一个问题作为重复的问题来解决是不会被冒犯的。这有助于保持堆栈溢出有序。这就是全部。这个链接应该可以帮助你回答你的问题。很抱歉,我并不是故意让它听起来有冒犯性,但我不认为在标题不尽相同的情况下,将一个问题归类为重复问题是多么公平。例如,如果一个人进行搜索,如果他们不知道解决方案是什么,他们就不会搜索,他们会用一个相对的标题来描述他们的问题,比如我的问题(如果你知道我的意思的话)。如果我不知道问题与this
context@jskidd3这个问题以重复的形式结束。如果有人遇到与您类似的问题并搜索并找到您的问题,他们将被引导到上面的副本,并给出回答该问题的答案。没有必要在多个问题上存在相同的答案。说结束这个问题“不公平”意味着它在某种程度上是消极的,而事实上,这只是一种将同一问题的所有版本指向一个答案,或者更确切地说是一组答案的方式。解决方案是正确的,但解释不是(完全)的此
不引用函数。他将函数绑定到窗口:window.addEventListener(“keydown”,onKeyDown,false)代码>。因此此
将成为窗口
对象。我不知道你指的是本身是什么意思。
var onKeyDown = function (e) {
this.keys.keyDown(e.keyCode);
},
var self = this;
var onKeyDown = function (e) {
self.keys.keyDown(e.keyCode);
},