3

I wrote some code like this

function Flasher() {
    this.cards = []
    this.map = {
        14: this.flip
    }
}
Flasher.prototype.flip = function() {
    alert(this.cards.length)
}
flasher = new Flasher()
flasher.map[14]()

Unfortunatley, the this object becomes the map object within the flip method and an error occurs (because cards is undefined).

How can I get this to function as intended? Calling flip indirectly via map is necessary, but I would like access to the original object within flip.

4

2 に答える 2

3
function Flasher() {
    var self = this;

    this.cards = [];
    this.map = {
        14: function() { self.flip(); }
    };
}
于 2012-10-18T00:48:13.777 に答える
1

ああ、プロトタイプパターンの煩わしさ

私はそれを次のようなモジュールとして書き直します:

function flasher() {
  var cards = [],
  flip = function (){
    alert(cards.length)
  },
  map = {
    14: flip
  };

  return {
    cards: cards,
    map: map,
    flip: flip
  };
}

次に、クロージャーがスコープをキャプチャし、これについて心配する必要はありません。ただし、フリップ関数がオブジェクトごとに複製されるため、メモリが少し失われます。しかし、コードは非常にクリーンで、プライベート変数を使用できると思います。

于 2012-10-18T01:00:19.153 に答える