coffeescript访问实例变量

时间:2012-11-03 18:57:38

标签: class scope coffeescript instance

我对js或coffeescript有点新,我无法弄清楚我的剧本有什么问题。

class Token

  fetching_token = $.Deferred()
  assigning_token = $.Deferred()

  constructor: ->
    @token = null
    @got_token = $.Deferred()    

  fetch = ->
    fetching_token.resolve({"access_token": '12355'})

  assign_token = (data) =>
    console.log "TOKEN (instance var): " + @token #undefined? 
    @token = data.access_token
    assigning_token.resolve()

  get_token: ->
    fetch()
    $.when(fetching_token).done (data) =>
      assign_token(data)
    $.when(assigning_token).done =>
      @got_token.resolve()
    undefined


t = new Token
t.get_token()

$.when(t.got_token).done ->
  console.log "FETCHED TOKEN: " + t.token #gives null

我试图在对象实例上公开以下界面:令牌 got_token get_token 。 由于某种原因, assign_token 中的 @token undefined 。我尝试了一些与胖箭头的组合,但无法使其工作。 提前谢谢

1 个答案:

答案 0 :(得分:2)

这是一个简单的(私有)函数,而不是方法:

f = (arg) -> ...

这是绑定到类的私有函数:

f = (arg) => ...

=>将函数绑定到函数定义时的@(AKA this)。当你这样说:

class C
    f = (arg) => ...
在解析@时,

C是类f,因此f是一种私有类方法。

重要的是,当你这样说时:

assign_token = (data) =>
  #...
@内的

assign_token不会是Token的实例,实际上它本身就是Token。您的@tokenToken实例上的实例变量,因此当Token中没有@的实例时,它未定义1}}。

您有几个选择:

  1. 使assign_token成为实例方法。这使得assign_token可以公开访问。
  2. 使用callapply强制@问题。这样可以保持assign_token私密,但通话更麻烦。
  3. 第一个选项如下:

    assign_token: (data) ->
        # Same stuff you already have
    

    当您致电assign_token时,(大部分)完成了第二次访问:

    assign_token = (data) ->
        # Same stuff you already have
    
    get_token: ->
      fetch()
      $.when(fetching_token).done (data) =>
        assign_token.call(@, data)
      #...
    

    在定义->时请注意瘦箭头(assign_token),它为您提供了一个简单的功能,以便您在使用函数{{1}调用它时可以设置所需的@方法。