Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";这";方法调用模式中的指针不指向对象_Javascript_Object_This_Method Invocation - Fatal编程技术网

Javascript";这";方法调用模式中的指针不指向对象

Javascript";这";方法调用模式中的指针不指向对象,javascript,object,this,method-invocation,Javascript,Object,This,Method Invocation,我试图在Javascript中使用方法调用模式。我将函数声明为对象成员 根据Javascript:The Good Parts,这将导致this指针引用封闭对象。当我以前试过这个的时候,情况就是这样 在下面的代码示例中,单个console.log语句的this指针引用指向函数,而不是对象。我已经仔细检查了我的代码,我真的不知道发生了什么 我可以用另一双眼睛来观察这个。我是否真的错过了一些明显的东西,或者我期待着错误的行为?多谢各位 编辑:我发布的代码中有一个错误(它一直在变化);匿名函数中的关键

我试图在Javascript中使用方法调用模式。我将函数声明为对象成员

根据Javascript:The Good Parts,这将导致
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
导入此模块,并从中调用函数。谢谢。您能否也演示一下如何在主脚本中调用该方法?