对象显示属性但访问它们返回undefined

时间:2012-09-06 21:15:21

标签: javascript

所以我正在编写一个游戏,我有一个模块可以返回当前通过jQuery按下的键。没有问题。当我尝试访问按下的键时出现问题:

var Keys = require('./lib/keys')

Player.prototype.update = function () {
    Keys(function (err, keydown) {
        console.log(keydown, keydown['w']);
        /* // To move a player up, for example:
          if (keydown['w']) {
            this.y += this.speed;
          }            
        */
    });
};

并且控制台显示按下了哪些键,但尝试访问一个键会给我一个未定义而不是真。

Object    undefined
s: true
w: true
x: true
__proto__: Object

有人有任何想法吗?

更新:关键模块

var $ = require('./jquery')

var Keys = function (callback) {
  var keydown = {};

  function keyName(event) {
    return String.fromCharCode(event.which).toLowerCase();
  }

  $(document).bind('keydown', function (event) {
    keydown[keyName(event)] = true;
    return false;
  });

  $(document).bind('keyup', function (event) {
    return false;
  });

  callback(null, keydown);
}

module.exports = Keys;

/ * ** * ** * ** * ** * *更新 * ** * ** * ** * ** < EM> * * /

这是最后的修复:

./ LIB / keys.js     var $ = require('./ jquery')

var Keys = function () {
  this.keydown = {};

  var keyName = function (event) {
    return String.fromCharCode(event.which).toLowerCase();
  }

  var self = this;
  $(document).bind('keydown', function (event) {
    self.keydown[keyName(event)] = true;
    return false;
  });

  $(document).bind('keyup', function (event) {
    self.keydown[keyName(event)] = false;
    return false;
  });
};

Keys.prototype.getKeys = function (callback) {
  callback(null, this.keydown);
}

module.exports = new Keys;

./ LIB / player.js     var Keys = require('./ keys')

var Player = function (game, keys) {
  // stuff
}

Player.prototype.update = function() {
  var self = this;
  Keys.getKeys(function(err, keys) {
    if (keys['w']) {
      self.y -= self.speed;
    }
    if (keys['a']) {
      self.x -= self.speed;
    }
    if (keys['s']) {
      self.y += self.speed;
    }
    if (keys['d']) {
      self.x += self.speed;
    }
  });

3 个答案:

答案 0 :(得分:4)

这是因为Keys中包含异步进程。

这只是一个已知的chrome问题,通过引用显示对象值。因此,在调用console.log

之后,您会在之后看到对象值

要查看更清晰的开放式chrome webdev工具,并将debugger;代替console.log,并查看keydown对象中的实际内容。我打赌它只是一个空洞的对象。

我将把它留在这里:http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

答案 1 :(得分:3)

这将教会我快速扫描代码。评论是正确的,这段代码并没有指出当前的问题。

每次输入新函数时,变量this都会重置。

Player.prototype.update = function () {
    var self = this;
    Keys(function (err, keydown) {
        console.log(keydown, keydown['w']);
        /* // To move a player up, for example:
          if (keydown['w']) {
            self.y += self.speed;
          }            
        */
    });
};

答案 2 :(得分:0)

我在这里看不到任何jQuery。您需要提供更多代码,例如Keys源代码。但我想您需要使用http://api.jquery.com/event.which/,例如keydown.which === 'w'