我试图在Javascript中使用方法调用模式。我将一个函数声明为对象成员。
根据 Javascript:好的部分,这应该导致this
指针引用封闭对象。当我以前试过这个时,就是这种情况。
在下面的代码示例中,单个this
语句的console.log
指针引用指向函数,而不是对象。我仔细检查了我的代码,老实说我不知道发生了什么。
我可以用另一双眼睛。有什么东西真的很明显我在这里失踪了,还是我期待错误的行为?谢谢。
编辑:我发布的代码中有一个错误(它一直在变化);匿名函数中的关键字应为that
,而不是this
。固定的。
DOUBLE EDIT:我在模块中添加了其余的代码。我正在尝试编写一个commonJS模块(根据我正在使用的gameJS库),虽然我不确定问题出在哪里,但我想知道它是不是。这会改变什么吗?
var gamejs = require('gamejs');
var system = require('app/system');
var input = {
eval_keys: function () {
console.log(this); // This should be the outer object, but shows the function!
var that = this;
gamejs.event.get().forEach(function (event) {
if (event.type === gamejs.event.KEY_DOWN) {
for (var key in that.keyconfig) {
if (that.keyconfig.hasOwnProperty(key)) {
if (event.key === gamejs.event[key]) {
that.keyconfig.key = true;
}
}
}
system.log("KEYDOWN", event.key);
}
if (event.type === gamejs.event.KEY_UP) {
for (var key in that.keyconfig) {
if (that.keyconfig.hasOwnProperty(key)) {
if (event.key === gamejs.event[key]) {
that.keyconfig.key = false;
}
}
}
system.log("KEYUP", event.key);
}
return keyconfig;
});
},
eval_mouse: function () {
/* in progress
else if (event.type === gamejs.event.MOUSE_MOTION) {
// if mouse is over display surface
if (display.rect.collidePoint(event.pos)) {
system.log("mousemove", testcoords);
testcoords = event.pos;
}
}
*/
},
keyconfig: {
K_UP: false,
K_LEFT: false,
K_RIGHT: false,
K_DOWN: false
}
};
exports.eval_keys = input.eval_keys;
Chrome的开发控制台输出:
Object {eval_keys: function}
eval_keys: function () {
arguments: null
caller: null
length: 0
name: ""
prototype: Object
__proto__: function Empty() {}
<function scope>
__proto__: Object
答案 0 :(得分:1)
通过在声明对象后调用input.eval_keys()
,它看起来像does work。
您在控制台中显示的输出也会让我看到您想要的输出 - 即包含该方法的外部对象Object {eval_keys: function}
。
问题似乎更多的是你应该看到你在那里声明的其他方法,如:
Object {eval_keys: function, eval_mouse: function, keyconfig: Object}
eval_keys: function () {
eval_mouse: function () {
keyconfig: Object
__proto__: Object
所以,据我所知,你的问题应该是“为什么这些其他方法不会出现在我控制台中的对象中?”但是我不知道你在做什么其他代码可能会解释这个问题,也不知道你在调用相关方法的方式和时间。
希望这有帮助。
答案 1 :(得分:0)
如果你没有使用forEach
loop的匿名函数,它会工作,this
keyword里面有不同的值。您可以在第二个参数中传递它:
gamejs.event.get().forEach(function (event) {
// this now refers to the outer this
}, this);
或者,您也可以使用引用外that
值的this
变量。
答案 2 :(得分:0)
好吧,我弄清楚是什么导致this
指针只显示一个带有一个函数的对象 - 就是这一行:
exports.eval_keys = input.eval_keys;
一时兴起,我决定添加exports.keyconfig = input.keyconfig
,它作为对象的一部分出现在控制台中。
exports
关键字在引用时使用this
指针执行某些操作,即使this
指针位于相关模块内部也是如此。我不确定它是如何工作的,但确实如此。
我遇到了更多问题,但目前,问题已经解决了。我将不得不对此进行更多阅读。