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

sen*_*nel 5 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;
          }            
        */
    });
};
Run Code Online (Sandbox Code Playgroud)

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

Object    undefined
s: true
w: true
x: true
__proto__: Object
Run Code Online (Sandbox Code Playgroud)

有人有什么想法?

更新:关键模块

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;
Run Code Online (Sandbox Code Playgroud)

/ ************* *更新 * ************* /

这是最后的修复:

./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;
Run Code Online (Sandbox Code Playgroud)

./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;
    }
  });
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 4

发生这种情况是因为Keys其中有异步进程。

这只是一个已知的 chrome 问题,通过引用显示对象值。所以你在调用不久就会看到对象值console.log

为了更清楚地看到它,请打开 chrome webdev 工具并放置debugger;代替console.log,看看keydown对象中实际有什么。我敢打赌它只是一个空物体。

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