Class coffeescript访问实例变量

Class coffeescript访问实例变量,class,scope,coffeescript,instance,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": '

我对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
我试图在对象的实例上公开以下接口:token、get\u token、get\u token。 由于某些原因,assign_token中的@token未定义。我尝试了一些与胖箭的组合,但没有成功。 提前感谢

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

f = (arg) -> ...
这是绑定到类的私有函数:

f = (arg) => ...
定义函数时,
=>
将函数绑定到任何
@
(又称
)上。当你这么说的时候:

class C
    f = (arg) => ...
assign_token = (data) =>
  #...
@
是解析
f
时的类
C
,因此
f
是一种私有类方法

重要的是,当你这么说的时候:

class C
    f = (arg) => ...
assign_token = (data) =>
  #...
@
内部
分配令牌
不会是
令牌
的实例,它实际上是
令牌
本身。您的
@token
token
实例上的一个实例变量,因此当您在
@
中没有
token
实例时,当然不会定义它

您有两个选择:

  • 使
    assign_token
    成为一个实例方法。这使得
    assign\u令牌
    可以公开访问
  • 使用或强制执行
    @
    问题。这使得
    assign\u令牌保持私有,但调用起来更麻烦
  • 第一个选项如下所示:

    assign_token: (data) ->
        # Same stuff you already have
    
    当您调用
    assign\u token
    时,第二个开启(大部分)完成:

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

    请注意,在定义
    分配令牌
    时,有一个细长的箭头(
    ->
    ),它为您提供了一个简单的函数,以便您可以在使用函数的
    调用
    方法调用时设置所需的
    @

    谢谢,它现在可以正常工作了。我不知道这个电话,我会记住的。