3

我正在使用如下代码

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 对象。使用原型框架我可以做类似的事情

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

我也很高兴,如果有人可以发布一些有用的关键字,我可以如何搜索这类问题,我敢肯定,我不是唯一一个问这个的人。但是,当您没有想到框架时,自然很难搜索“原型”,而是对象的扩展(或您如何称呼它)。

谢谢

4

2 回答 2

1

幸运的是,jQuery 提供了一种与Prototype 提供的$.proxy功能相同的方法。bind

http://api.jquery.com/jQuery.proxy/上有一个文档页面。

希望有帮助,戴夫

于 2012-05-25T10:04:20.230 回答
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(', '));
   };
};
于 2012-05-25T10:03:18.683 回答