Javascript“this"方法调用模式中的指针没有指向对象
Javascript "this" pointer in Method Invocation Pattern not pointing to object
我试图在Javascript中使用方法调用模式。我将函数声明为对象成员。
根据Javascript: The Good Parts,这应该导致this
指针引用封闭对象。当我以前尝试过的时候,情况就是这样。
在下面的代码示例中,单个console.log
语句引用的this
指针指向函数,而不是对象。我已经仔细检查了我的代码,我真的不知道是怎么回事。
我可以用另一双眼睛看这件事。是我忽略了什么明显的东西,还是我期望错误的行为?谢谢你。
编辑:我在我发布的代码中有一个错误(它一直在变化);匿名函数内部的关键字应该是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
通过在对象声明后调用input.eval_keys()
,看起来对我来说确实有效。
您在控制台中显示的输出在我看来也是您想要的输出——即,包含该方法的外部对象Object {eval_keys: function}
。
Object {eval_keys: function, eval_mouse: function, keyconfig: Object}
eval_keys: function () {
eval_mouse: function () {
keyconfig: Object
__proto__: Object
所以,据我所知,你的问题应该是"为什么这些其他方法不在控制台的对象中显示?"但是我不知道你在代码中做了什么,也不知道你是如何以及何时调用相关方法的。
如果您不使用forEach
循环的匿名函数,则可以工作,this
关键字在其中有不同的值。你可以把它传递给第二个参数:
gamejs.event.get().forEach(function (event) {
// this now refers to the outer this
}, this);
或者你可以使用你的that
变量,它也引用外部的this
值
好吧,我弄清楚是什么导致this
指针只显示一个对象与一个函数-它是这一行:
exports.eval_keys = input.eval_keys;
一时兴起,我决定添加exports.keyconfig = input.keyconfig
,它出现在控制台作为对象的一部分。
看起来exports
关键字在this
指针被引用时做了一些事情,即使this
指针在有问题的模块内部。我不太确定这是怎么回事,但它确实做到了。
- Javascript:将函数指针放在对象中
- 我可以在HTML5画布中创建图形形状对象吗?以及当用户将鼠标悬停在形状上时如何将光标显示为指针
- 查找具有字段值的对象(这是一个指针)
- 如何使对象的函数或属性成为指向另一个对象函数的指针
- Parse.com / Javascript - 将用户对象ID字符串保存为用户指针
- Parse.com 云代码保存( )错误:“未捕获 尝试使用指向新的未保存对象的指针保存对象
- 对闭包内对象的赋值的行为类似于指针
- 解析 - JavaScript 指针查询,从指针返回解析对象的问题
- 如何获取具有指针字段的对象 ID 的记录
- 解析云代码在保存后返回指针而不是对象
- 在 Javascript 中的 parse.com 个对象中查询指针
- 指向对象的JS指针
- Parse.com正在查询包含指针数组的对象,该数组无法使用include
- Parse.com Cloud Code beforeSave()错误:"未捕获尝试用指向新的未保存对象的指针
- Parse.comJavascript API,查询包含指针列表的对象列表
- Javascript 变量作为对象指针
- Javascript:从指针修改对象
- 如何在同一个循环中创建一个Parse.com对象和一个指针对象?
- 重置game.input.onDown时使用哪个指针对象(即光标)
- 如何从"_User"获取userId作为指针对象