Javascript";这";方法调用模式中的指针不指向对象
我试图在Javascript中使用方法调用模式。我将函数声明为对象成员 根据Javascript:The Good Parts,这将导致Javascript";这";方法调用模式中的指针不指向对象,javascript,object,this,method-invocation,Javascript,Object,This,Method Invocation,我试图在Javascript中使用方法调用模式。我将函数声明为对象成员 根据Javascript:The Good Parts,这将导致this指针引用封闭对象。当我以前试过这个的时候,情况就是这样 在下面的代码示例中,单个console.log语句的this指针引用指向函数,而不是对象。我已经仔细检查了我的代码,我真的不知道发生了什么 我可以用另一双眼睛来观察这个。我是否真的错过了一些明显的东西,或者我期待着错误的行为?多谢各位 编辑:我发布的代码中有一个错误(它一直在变化);匿名函数中的关键
this
指针引用封闭对象。当我以前试过这个的时候,情况就是这样
在下面的代码示例中,单个console.log
语句的this
指针引用指向函数,而不是对象。我已经仔细检查了我的代码,我真的不知道发生了什么
我可以用另一双眼睛来观察这个。我是否真的错过了一些明显的东西,或者我期待着错误的行为?多谢各位
编辑:我发布的代码中有一个错误(它一直在变化);匿名函数中的关键字应该是that
,而不是this
。固定的
双重编辑:我已经在模块中添加了剩余的代码。我正在尝试编写一个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
对象{eval_键:函数}
评估键:函数(){
参数:null
呼叫方:空
长度:0
姓名:“
原型:对象
__proto_;:函数Empty(){}
__原型:对象
如果不使用匿名函数,则该函数会起作用,其中的值不同。您可以在第二个参数中传递它:
gamejs.event.get().forEach(function (event) {
// this now refers to the outer this
}, this);
或者,您也可以使用引用外部此值的变量。在声明对象后,通过调用input.eval_keys()
,我觉得它很像
在我看来,您在控制台中显示的输出也是您想要的输出——即,包含该方法的外部对象object{eval\u keys:function}
问题似乎更多的是,您应该看到您在其中声明的其他方法,如下所示:
Object {eval_keys: function, eval_mouse: function, keyconfig: Object}
eval_keys: function () {
eval_mouse: function () {
keyconfig: Object
__proto__: Object
因此,据我所知,您的问题应该是“为什么这些其他方法没有显示在控制台中的我的对象中?”但我不知道您正在对代码做什么,也不知道如何以及何时调用相关方法
希望这有帮助。好吧,我找到了导致这个
指针只显示一个具有一个函数的对象的原因-这是这一行:
exports.eval_keys = input.eval_keys;
一时兴起,我决定添加exports.keyconfig=input.keyconfig
,它作为对象的一部分出现在控制台中
在引用时,exports
关键字似乎对this
指针起了作用,即使this
指针位于相关模块内。我不太清楚它是如何工作的,但确实起了作用
我遇到了更多的问题,但目前,眼前的问题已经解决。我必须对此进行更多的阅读。我看不到您的代码的入口点……调用了什么以及在哪里?对我来说就像预期的一样->,并且您发布的控制台的输出告诉我它与您期望的一样工作o、 而这个
实际上是将其记录到控制台的外部对象。在其他函数的作用域内,这个
当然会引用该作用域等@jondavidjohn我从主脚本调用该函数。我将其作为commonJS模块导入其中。(我已经更新了我的帖子,以反映这一点,以防这在某种程度上引起了一些问题。)但是,我希望,在创建对象时,这个
指针应该会显示我所有的方法……在exports.eval_keys=input.eval_keys;
之后,您可能会错误地调用它。您可能不再在input
上作为方法调用它了。请尝试exports.eval_keys=input.eval_keys.bind(input)
哇-抱歉,我的代码正在编写中。内部函数中的this
关键字实际上应该是that
。我会编辑。我已经更新了我的帖子,以反映这是一个使用exports
关键字的CommonJS模块。我认为这与此无关,但可能有一些我不知道的东西。作为参考,我正在用main.js文件中的require
导入此模块,并从中调用函数。谢谢。您能否也演示一下如何在主脚本中调用该方法?