将事件绑定到事件后,使用“this”访问对象本身

时间:2013-03-30 03:14:00

标签: javascript oop object

当我尝试使用“this”关键字访问对象时,我得到的是“window”对象而不是对象本身,因为我将它的函数绑定到一个事件而该事件属于window对象。

在示例中,alert(this.osd)表示它未定义,因为“window”对象中没有“osd”。那么,解决这个问题的最佳方法是什么?将游戏对象定义为window.game?

var game = {

    osd : null,
    stage : null,

    tick : function(){
        alert(this.osd);

    },

    init : function(){

        // Configure the OSD
        this.osd = "a";

        // Preapare the stage;
        this.stage = "b";
        window.addEventListener("click",this.tick);
    }
}

game.init();

2 个答案:

答案 0 :(得分:3)

您需要使用对象上下文调用tick方法,如下所示:

var self = this;
window.addEventListener("click", function() {self.tick()});

或者,您可以在现代浏览器中使用.bind(),它基本上使用相同的东西(它创建一个使用正确的对象上下文调用实际方法的存根函数)。

window.addEventListener("click", this.tick.bind(this));

问题在于,当您将this.tick传递给addEventListener()时,您只是将函数引用传递给tick函数,而您实际上并未传递对象引用。因此,当addEventListener()调用tick而没有任何对象引用时,没有对象引用的函数调用的默认值thiswindow(当不处于严格模式时),这就是你所看到的

答案 1 :(得分:-1)

您可以使用闭包绑定,如下所示:

window.addEventListener('click',(function(o){return function(){o.tick()}})(this));

此外,(与您的问题无关),因为您正在创建初始化函数,所以最好使用类/实例设置:

function Game( myParameter ) {
    this.osd = "a";
    this.tick = function( ) {
    }
    window.addEventListener('click',(function(o){return function(){o.tick()}})(this));
}
var game = new Game( 3 );

请注意,game现在使用new创建,我们可以将参数传递给其“构造函数”函数。