我正在使用如下代码
function Basket () {
this.items = new Array();
}
Basket.prototype.addItem = function(item) {
this.items.push(item);
setTimeout(this.showItems, 1000);
};
Basket.prototype.showItems = function() {
console.log('items in Basket: '+this.items.join(', '));
}
var b = new Basket()
b.addItem('bananas')
// -> Uncaught TypeError: Cannot call method 'join' of undefined
调用addItem方法时,showItems方法被正确调用,但在showItems方法中,变量“this”不引用Basket对象。 使用Prototype框架我可以做类似的事情
setTimeout(this.showItems.bind(this), 1000)
这会将变量“this”绑定到showItems方法中的Basket对象。
问题:如何在jQuery中实现这一点?有没有比包装调用方法更优雅的方法(最佳实践):
// ...
$this = this
setTimeout(function() {$this.showItems($this)}, 1000)
Basket.prototype.showItems = function ($this) {
console.log('items in Basket: '+$this.items.join(', '));
}
我也很高兴,如果有人可以发布一些有用的关键词,我怎么能搜索那类问题,因为我敢肯定,我不是唯一一个问这个问题的人。但是当你没有考虑框架时,自然很难搜索“原型”,但是对象的扩展(或者你如何称呼它)。
THX
答案 0 :(得分:1)
幸运的是,jQuery提供了一个$.proxy
方法,它与Prototype提供的bind
具有相同的功能。
http://api.jquery.com/jQuery.proxy/提供了一个文档页面。
希望有所帮助, 戴夫
答案 1 :(得分:0)
为什么不简单地将方法添加到篮子?
function Basket () {
var items = new Array();
this.addItem = function(item) {
items.push(item);
setTimeout(this.showItems, 1000);
};
this.showItems = function() {
console.log('items in Basket: '+ items.join(', '));
};
};