【问题标题】:coffeescript accessing instance variable咖啡脚本访问实例变量
【发布时间】:2012-11-03 18:57:37
【问题描述】:

我对 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

我试图在对象实例上公开以下接口:tokengot_tokenget_token。 出于某种原因,assign_token 中的 @tokenundefined。我尝试了一些与 fat arrow 的组合,但无法使其发挥作用。 提前谢谢你

【问题讨论】:

    标签: class scope coffeescript instance


    【解决方案1】:

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

    f = (arg) -> ...
    

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

    f = (arg) => ...
    

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

    class C
        f = (arg) => ...
    

    @C 时正在解析 f 时的类,因此 f 是一种私有类方法。

    重要的是当你这样说时:

    assign_token = (data) =>
      #...
    

    @ 内的assign_token 不会是Token 的实例,它实际上是Token 本身。你的@tokenTokeninstances 上的一个实例变量,所以当你在@ 中没有Token 的实例时,它当然没有被定义。

    你有几个选择:

    1. assign_token 设为实例方法。这使得 assign_token 可以公开访问。
    2. 使用callapply 强制@ 问题。这使assign_token 保持私密,但调用起来更麻烦。

    第一个选项如下所示:

    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时的细箭头(->),它为您提供了一个简单的函数,以便您可以在使用函数的call方法调用它时设置所需的@

    【讨论】:

    • 谢谢,它现在按预期工作。我不知道 call,我会记住的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2011-10-13
    • 1970-01-01
    • 2023-03-23
    • 2018-05-18
    • 2016-08-23
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多