3

我写了一些这样的代码

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

不幸的是,该this对象成为flip方法内的地图对象并发生错误(因为cards未定义)。

我怎样才能让它按预期运行?flip间接调用viamap是必要的,但我想访问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 回答