2013-03-24 48 views
3

我正在尝试在Javascript中使用方法调用模式。我声明一个函数作为对象成员。方法调用模式中的Javascript“this”指针不指向对象

根据Javascript:好部件,这应该导致this指针引用封闭对象。当我以前尝试过这种情况时,情况就是如此。

在下面的代码的示例,由单个console.log语句this指针引用指向的功能,不是对象。我仔细检查了我的代码,我真的不知道发生了什么。

我可以使用另一双眼睛在这个。有没有真正明显的我在这里失踪,还是我期待错误的行为?谢谢。

编辑:我在我的代码中发布了一个错误,我发布了(它一直在流量);匿名函数中的关键字应该是that,而不是this。固定。

DOUBLE EDIT:我在模块中添加了其余的代码。我试图编写一个commonJS模块(根据我使用的gameJS库),虽然我不确定这会是什么问题,但我想知道是否是。这会改变什么吗?从Chrome的开发者控制台

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; 

输出:

Object {eval_keys: function} 
eval_keys: function() { 
arguments: null 
caller: null 
length: 0 
name: "" 
prototype: Object 
__proto__: function Empty() {} 
<function scope> 
__proto__: Object 
+2

我没有看到你的代码的入口点....什么是被调用和在哪里? – jondavidjohn 2013-03-24 18:05:17

+1

正如我预料的那样工作 - > [** FIDDLE **](http://jsfiddle.net/YQPF2/),并且您发布的控制台输出告诉我,它的工作方式与您的预期一样,并且'this'实际上是将其登录到控制台的外部对象。在其他函数的范围内,'this'当然会引用范围等。 – adeneo 2013-03-24 18:07:17

+0

@jondavidjohn我从我的主脚本中调用函数。我将它作为commonJS模块导入。 (我更新了我的帖子以反映这一点,以防某些问题导致某些问题。)但是,我期望在创建对象时,'this'指针应该显示我所有的方法... – 2013-03-24 18:20:46

回答

1

它看起来像does work给我,通过在声明对象后调用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 

所以,据我所知,你的问题应该是“为什么不是活得t这些其他方法显示在控制台中的对象内吗?“但是我不知道你在做什么,可能会解释这个问题,也不知道你如何以及何时调用相关方法。

希望这会有所帮助。

+0

我已更新我的帖子,以反映这是使用'exports'关键字的CommonJS模块。我不认为这是相关的,但也许有些事我不知道。作为参考,我在main.js文件中用'require'导入了这个模块,然后从那里调用函数。 – 2013-03-24 18:21:49

+0

谢谢。你也可以展示你做什么然后在主脚本中调用该方法? – guypursey 2013-03-24 18:29:37

0

,如果你没跟forEach loop使用匿名函数它的工作中,this keyword具有内部有不同的价值。您可以在第二个参数传递:

gamejs.event.get().forEach(function (event) { 
    // this now refers to the outer this 
}, this); 

或者您可以使用您的that变量,它指的是外this价值为好。

+0

哎呀 - 对不起,我的代码正在进行中。内部函数中的'this'关键字实际上应该是'that'。我会编辑。 – 2013-03-24 18:10:12

0

好吧,我想通了什么导致this指针只显示一个对象,具有一个功能 - 这是这一行:

exports.eval_keys = input.eval_keys; 

一时心血来潮,我决定添加exports.keyconfig = input.keyconfig,它出现在控制台作为对象的一部分。

看起来exports关键字在被引用时会与this指针做某事,即使this指针位于相关模块中。我不确定这是如何工作的,但它确实如此。

我遇到了更多问题,但目前,眼前的问题已得到解决。我将不得不做更多的阅读。

相关问题