Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Object - Fatal编程技术网

Javascript 使用“访问对象本身”;这";绑定后';事件的函数

Javascript 使用“访问对象本身”;这";绑定后';事件的函数,javascript,oop,object,Javascript,Oop,Object,当我尝试使用“this”关键字访问对象时,我得到的是“window”对象而不是对象本身,因为我将它的函数绑定到一个事件,而该事件属于window对象 在本例中,alert(this.osd)表示它未定义,因为“window”对象中没有“osd”。那么,解决这个问题的最佳方法是什么?将游戏对象定义为window.game var game = { osd : null, stage : null, tick : function(){ alert(thi

当我尝试使用“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();

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

var self = this;
window.addEventListener("click", function() {self.tick()});
window.addEventListener('click',(function(o){return function(){o.tick()}})(this));
或者,您可以在现代浏览器中使用
.bind()
,这在本质上是相同的(它创建一个存根函数,用正确的对象上下文调用实际方法)



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

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

var self = this;
window.addEventListener("click", function() {self.tick()});
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
创建的,我们可以将参数传递给它的“构造函数”函数。

闭包,请参见。
window.addEventListener('click',this.tick.bind(this))
game
在该代码中不是真正的对象“是的”。它是用对象文字声明的。游戏是一个有方法的真实对象。@zzbov等人。是的,好的。我错过了这个问题(现在编辑)。但它不是一个真正的对象(就OOP而言);例如,原型定义需要
new
关键字。也可以使用静态声明创建对象,就像OP代码中的
game
对象一样。您似乎误以为静态声明的对象不是真正的对象。这是错误的。@jfriend00我知道它是一个对象,在这种情况下,它的功能会非常好,但是(在我看来)这是一个糟糕的做法,因为它不是一个OOP对象。它不符合标准类/实例设置,不支持原型。感谢您的启发。=)