在使用方法原型时将其传递给jQuery中的方法

时间:2012-05-25 09:48:40

标签: jquery binding methods this prototyping

我正在使用如下代码

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

2 个答案:

答案 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(', '));
   };
};