javascript - 更好的写作方式(javascript)

标签 javascript oop class function object

可能是对这里的javascript缺乏理解:

engine.keyboard = {};   // keyboard object

engine.keyboard.key = {
_pressed: {},

UP: 38,
DOWN: 40,
LEFT: 37,
RIGHT: 39,

isDown: function(keyCode)
{
    return this._pressed[keyCode];
},

onKeyDown: function(event)
{
    this._pressed[event.keyCode] = true;
},

onKeyUp: function(event)
{
    delete this._pressed[event.keyCode];
}

}

engine.keyboard.addListeners = function()
{
window.addEventListener('keydown', engine.keyboard.key.onKeyDown, false);
window.addEventListener('keyup', engine.keyboard.key.onKeyUp, false);
}

当我调用 engine.keyboard.key.isDown(38) 时,我收到一个错误,指出 this._pressed 未定义。

也许有更好的方法来定义所有这些?我正在开发一款非常基本的游戏,但只是尝试使用不同的方式将其全部拆分。所以目前,我有 engineengine.keyboardengine.cameraengine.map 这些都是做自己的小位。我在每一个的开头都使用了相同的 engine.EXAMPLE = {}。也许这是低效的?

干杯。

最佳答案

问题是您只将函数作为事件处理程序传递。通过这样做,它不再与 engine.keyboard.key 对象相关。

函数中的 this 指的是什么取决于它是如何被调用的。为了让 this 引用 engine.keyboard.key,必须像这样调用该函数

engine.keyboard.key.onKeyDown()

所以你需要的是:

window.addEventListener('keydown', function(event) {
    engine.keyboard.key.onKeyDown(event);
}, false);

window.addEventListener('keyup', function(event) {
    engine.keyboard.key.onKeyUp(event);
}, false);

另请注意,addEventListener 在 IE8 及以下版本中不可用。在那里你必须使用 attachEvent

我建议阅读 excellent articles about event handling on qurirksmode.org .


进一步建议:

要以某种方式将函数与对象分离,您可以创建一个闭包:

engine.keyboard = {};  
engine.keyboard.key = (function() {
    var _pressed = {};

    var key = {
        UP: 38,
        DOWN: 40,
        LEFT: 37,
        RIGHT: 39,

        isDown: function(keyCode)  {
            return _pressed[keyCode];
        },

        onKeyDown: function(event) {
            _pressed[event.keyCode] = true;
        },

        onKeyUp: function(event) {
            delete _pressed[event.keyCode];
        }
    }
    return key;
}());

这里传递 engine.keyboard.key.onKeyDown 没有问题,因为函数不再依赖于 this_pressed 现在是函数定义范围内的一个变量,因此它们可以访问它。

这只是为了展示可以做什么。

关于javascript - 更好的写作方式(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873735/

相关文章:

javascript - MySQL:使用 JSON 解析时,SUM(column) 始终返回 null

javascript - 如何在 ReactJS 中创建和应用基于 CSS 类的动态样式表?

javascript - onChange 仅偶尔触发一次

javascript - 如何使用 JQuery 将 onclick 事件处理程序添加到 anchor 标记?

javascript - CSS模块导出的模块是一个空对象?

c# - 使用结构而不是给构造函数 8 个参数是否正确?

oop - 为什么称为“开放(或封闭)递归?”

c++ - 动态调度 OOP

Java 泛型类数组

java - 为什么我的分数变量在我的 GameScreen 类之外不可评估?