方法调用模式中的Javascript“this”指针未指向对象

时间:2013-03-24 18:01:45

标签: javascript object this method-invocation

我试图在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

3 个答案:

答案 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指针位于相关模块内部也是如此。我不确定它是如何工作的,但确实如此。

我遇到了更多问题,但目前,问题已经解决了。我将不得不对此进行更多阅读。