从JavaScript中的另一个方法属性引用object方法属性

时间:2014-11-11 11:50:49

标签: javascript oop object methods closures

我有这种奇怪的行为,即使我能轻易解决这个问题,我也想知道为什么会这样。

    function Game () {
        this.viewport = { ... };
        this.player = Player;
        this.renderer = { ... };
        this.stage = { ... };

        this.init = function () {                 
             //THIS GETS EXECUTED
             this.setKeyBindings();
        }

        this.run = function () {
             //THIS WORKS TOO
             requestAnimFrame(this.update);
        }

        this.update = function () {
             //BAD! THROWS UNDEFINED IS NOT A FUNCTION
             //HERE I NEED TO USE A REFERENCE HERE

             this.processInput();
             this.renderer.render(this.stage);
             this.handleLogic();

             //EVEN THIS ONE WON'T WORK, BUT IT WORKED IN init()!
             requestAnimFrame(this.update);
        };

        //METHODS ARE DEFINED THE SAME WAY
        this.processInput = function () {
            ...
        };

        this.handleLogic = function () {
            ...
        };

        this.setKeyBinding = function () {
            ...
        }
    }       

所以我明显遗漏了一些东西:

this.setKeybindings()从init方法中成功执行。

this.processInput()抛出错误。

我不需要解决方法,我使用本地参考解决了这个问题,如下所示:

        function Game () {
         var reference = this;
         .......
         this.update = function () {
             //NOW WORKS
             reference.processInput();
             reference.handleLogic();
             reference.renderer.render(reference.stage);
             requestAnimFrame(reference.update);
        }

        this.init = function () {
             //THIS ONE WORKS EVEN USING 'this'
             this.setKeyBindings()
        }
    }

我想知道为什么'这个'仅适用于某些方法(如init),而不适用于其他方法(如更新)。

1 个答案:

答案 0 :(得分:0)

声明局部变量并为其指定并在任何地方使用它:

function Game () {
     var me = this;
     .......
     me.update = function () {
         me.processInput();

         me.handleLogic();

         me.renderer.render(me.stage);

         requestAnimFrame(me.update);
    }
}

这将解决您的参考问题