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オブジェクトを参照しません。Prototype Frameworkを使用すると、次のようなことができます。

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 に答える