Javascript 使用“访问对象本身”;这";绑定后';事件的函数
当我尝试使用“this”关键字访问对象时,我得到的是“window”对象而不是对象本身,因为我将它的函数绑定到一个事件,而该事件属于window对象 在本例中,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
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对象。它不符合标准类/实例设置,不支持原型。感谢您的启发。=)