Javascript此关键字引用另一个对象

Javascript此关键字引用另一个对象,javascript,this,Javascript,This,我有这个剧本: Bla = function() { this.prop = 123; } Bla.prototype.yay = function() { console.log(this,this.prop); } X = new Bla(); $(document).ready(X.yay); // output: #document undefined --> why? $(document).ready(function(){ X.yay(); // output:

我有这个剧本:

Bla = function() {
  this.prop = 123;
}
Bla.prototype.yay = function() {
  console.log(this,this.prop);
}
X = new Bla();

$(document).ready(X.yay); // output: #document undefined --> why?
$(document).ready(function(){
  X.yay(); // output: Bla 123 --> desired result
});

如何在不扩展
对象的情况下正确地进行第一次调用(
应指X)?

简短回答,无论在何处调用函数,
指的是对象,它是对象的属性,或者全局对象不是对象的属性

将方法传递给函数时,该函数不再是对象的方法,而是函数的局部变量,在这种情况下,
this
引用
document
对象,因为该对象是调用document ready事件的对象

在现代JavaScript实现中,您可以将方法添加到对象

示例:

$(document).ready(X.yay.bind(X));

请注意,这需要IE9或更高版本。您使用的匿名函数也是一个可接受的解决方案,将在旧版本的IE中工作。

您可以使用
bind

$(document).ready(X.yay.bind(X));

这会在函数周围创建一个“包装器”,在调用时将
This
设置为
X

什么意思,“不扩展
Object
”?不添加
Object.prototype.bla
呃,我认为甚至没有使用
Object.prototype
…如果我没有忘记,有
ImpactJS
库中的
Object.prototype.bind
(我问这个问题是因为我忘了
bind
函数的名称)我从来没有听说过ImpactJS,但你记得的是-它是本机的,不需要对
对象进行任何扩展。除了
这个
没有引用全局对象,但是
document
?@Bergi抓得好!这是有道理的。我已经更正了我的答案。