更好的写作方式(javascript)

时间:2011-05-03 18:05:32

标签: 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 = {}。也许这效率很低?

干杯。

2 个答案:

答案 0 :(得分:3)

问题是您只是将函数作为事件处理程序传递。通过这样做,它与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现在是函数定义范围内的变量,因此它们可以访问它。

这只是为了表明可以做些什么。

答案 1 :(得分:-1)

这是一个标准的键处理程序。我不相信有更好的方法可以做。