传递方法时访问javascript实例成员

时间:2012-10-18 00:46:48

标签: javascript scope

我写了一些这样的代码

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间接致电map,但我想访问flip内的原始对象。

2 个答案:

答案 0 :(得分:3)

function Flasher() {
    var self = this;

    this.cards = [];
    this.map = {
        14: function() { self.flip(); }
    };
}

答案 1 :(得分:1)

原型模式的麻烦啊

我会把它重写为像这样的模块:

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

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

然后封闭捕捉你的范围,你永远不必担心这个。虽然为每个对象复制了翻转函数,但会丢失一些内存。但我认为代码更清晰,它允许私有变量。