Node.js模块“ this”重置

蒂蒙·米歇尔(Timon Michel)

PlayerTracker.js:

var util = require('util');
var PlayerTracker = function(GameServer, pos) {
  this.gs = GameServer;
  this.pos = pos;
  this.left = false;
  this.right = false;
  console.log("constructor" + util.inspect(this));
};

PlayerTracker.prototype.getPos = function() {
  return this.pos;
};

PlayerTracker.prototype.setPos = function() {
  return this.pos;
};

PlayerTracker.prototype.setLeft = function(left) {
  this.left = left;
};
PlayerTracker.prototype.setRight = function(left) {
  this.right = left;
};

PlayerTracker.prototype.moveTick = function() {
  console.log(util.inspect(this));
  if (this.left) {
    if (this.pos <= 0) {

    } else {
      this.pos--;
      this.left = false;
    }
  } else if (this.right) {
    if (this.pos >= 10) {

    } else {
      this.pos++;
      this.right = false;
    }
  }
};
module.exports = PlayerTracker;

一开始,我得到:

constructor{ gs:       
{ config: { serverPort: 1010, testValue: 0 },
 socketServer:
  { domain: null,
    _events: [Object],
    _maxListeners: undefined,
    _server: [Object],
    _closeServer: [Function],
    options: [Object],
    path: null,
    clients: [Object] } },
  pos: 5,
  left: false,
  right: false }

但是当我打电话给MoveTick之后,我得到了:

{ _idleTimeout: 500,
_idlePrev: null,
_idleNext: null,
_idleStart: 4060813,
_onTimeout: [Function: wrapper],
_repeat: true }

看起来像是这种杂音重置。我只是打开它,var playerTracker = new PlayerTracker(this,5)然后调用它,而setInterval(playerTracker.moveTick,500)我只是想保持该位置,依此类推。你知道什么原因吗?

slebetman

您要么需要做:

setInterval(function(){playerTracker.moveTick()},500);

或者:

setInterval(playerTracker.moveTick.bind(playTracker),500);

这是因为thisjavascript中的值取决于调用方法的方式。

当您这样做时:

setInterval(playerTracker.moveTick,500);

您真正在做的是:

var x = playerTracker.moveTick;
setInterval(x,500);

因此,setInterval会在没有playTracker对象的情况下调用您的函数在这种情况下,该moveTick函数称为常规函数。根据天气与否,您处于严格模式this是未定义还是全局对象(window在浏览器中)。

有关this工作原理的完整(最新)信息,请参见此相关答案Javascript中的“ this”关键字如何在对象文字中起作用?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章