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抓得好!这是有道理的。我已经更正了我的答案。