Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类中的JavaScript对象是';未定义';_Javascript_Html_Oop_Prototype - Fatal编程技术网

类中的JavaScript对象是';未定义';

类中的JavaScript对象是';未定义';,javascript,html,oop,prototype,Javascript,Html,Oop,Prototype,我下面有一个类,它控制着一个小的HTML5游戏。您将在startName方法中看到几行,一个对象被保存到一个名为keys的属性中,这是keys类的一个实例 在此之后,我调用该类中另一个名为setEventHandlers的方法。理论上,这应该设置调用回调的处理程序,回调将数据发送到keys对象(存储为属性) 每当调用this.keys.keyDown或this.keys.keydup时,它表示“keys”未定义 我似乎不明白为什么会发生这种情况,这似乎与执行顺序有关。有什么想法吗?提前谢谢 fu

我下面有一个类,它控制着一个小的HTML5游戏。您将在startName方法中看到几行,一个对象被保存到一个名为keys的属性中,这是keys类的一个实例

在此之后,我调用该类中另一个名为setEventHandlers的方法。理论上,这应该设置调用回调的处理程序,回调将数据发送到keys对象(存储为属性)

每当调用
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);
},