Node.js 模块 "this" 重置
Node.js module "this" resets
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)
调用它
我只想保住位置等等。
你知道什么原因吗?
你要么需要做:
setInterval(function(){playerTracker.moveTick()},500);
或:
setInterval(playerTracker.moveTick.bind(playTracker),500);
那是因为 javascript 中 this
的值取决于您如何调用该方法。
当你这样做时:
setInterval(playerTracker.moveTick,500);
你真正在做的是:
var x = playerTracker.moveTick;
setInterval(x,500);
因此 setInterval
在没有 playTracker
对象的情况下调用您的函数。在这种情况下,moveTick
函数被称为常规函数。根据天气情况,您是否处于严格模式 this
未定义或全局对象(浏览器中的 window
)。
有关 this
如何工作的完整(和最新)描述,请参阅此相关答案:How does the "this" keyword in Javascript act within an object literal?
当你调用 setInterval(playerTacker.moveTick, 500)
时发生的事情是函数 moveTick
在 500 毫秒后在不同的上下文中被调用,并且 this
的值将是一个指向的对象可能是间隔超时控制器。
要使其成为您想要的 运行,您需要确保该函数在 class PlayerTracker
[ 的正确实例的上下文中是 运行 =15=]
试试这个:
setInterval(function(){playerTracker.moveTick()}, 500)
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)
调用它
我只想保住位置等等。
你知道什么原因吗?
你要么需要做:
setInterval(function(){playerTracker.moveTick()},500);
或:
setInterval(playerTracker.moveTick.bind(playTracker),500);
那是因为 javascript 中 this
的值取决于您如何调用该方法。
当你这样做时:
setInterval(playerTracker.moveTick,500);
你真正在做的是:
var x = playerTracker.moveTick;
setInterval(x,500);
因此 setInterval
在没有 playTracker
对象的情况下调用您的函数。在这种情况下,moveTick
函数被称为常规函数。根据天气情况,您是否处于严格模式 this
未定义或全局对象(浏览器中的 window
)。
有关 this
如何工作的完整(和最新)描述,请参阅此相关答案:How does the "this" keyword in Javascript act within an object literal?
当你调用 setInterval(playerTacker.moveTick, 500)
时发生的事情是函数 moveTick
在 500 毫秒后在不同的上下文中被调用,并且 this
的值将是一个指向的对象可能是间隔超时控制器。
要使其成为您想要的 运行,您需要确保该函数在 class PlayerTracker
[ 的正确实例的上下文中是 运行 =15=]
试试这个:
setInterval(function(){playerTracker.moveTick()}, 500)