【问题标题】:How to use set methods to initialize instance variables via constructor in coffeescript如何使用set方法通过coffeescript中的构造函数初始化实例变量
【发布时间】:2013-09-14 19:39:31
【问题描述】:

我在咖啡脚本中有一个“类”,我想用实例方法初始化它的实例变量,这些实例方法通过回调返回一个值,但它没有像我希望的那样工作:

  EventEmitter = require('events').EventEmitter

  class MyClass extends EventEmitter
    constructor: ->
      @datamember: setDatamember()

    setDatamember: ->
      someFunction (response) ->
        @datamember = response
        @emit 'init'

    getDatamember: ->
      return @datamember

  ----

  myObj = new MyClass
  myObj.on 'init', ->
    console.log myObj.getDatamember

我得到的结果表明,setDatamember 中的“this”指的是与对象实例中的“this”不同的东西。如果我显式调用 myObj.setDatamember,我会得到预期的结果,但是有没有办法在构造函数中调用 set 方法——特别是通过回调设置数据成员的方法?我查看了docs,以及其他各种咖啡脚本信息来源(例如this one),但没有发现任何与此相关的内容。

【问题讨论】:

    标签: class constructor coffeescript instance-variables instance-methods


    【解决方案1】:

    尝试在除构造函数之外的所有内容上使用粗箭头:

     class MyClass
        constructor: ->
          @setDatamember()
    
        setDatamember: =>
          someFunction (response) =>
            @datamember = response
    
        getDatamember: =>
          return @datamember
    

    但是,您还希望将 someFunction 作为异步函数放入其中,因此您永远无法做到

    mc = new MyClass
    console.log mc.datamember
    

    因为在访问mc.datamember之前不会等待someFunction返回。

    【讨论】:

    • 谢谢 - 我会试试这个。我还编辑了示例以在访问数据之前正确等待回调返回。很好的收获。
    • 恐怕没用。使用 setDatamember(而不是 @setDatamember)按照您的建议进行操作会引发参考错误:未定义 setDatamember。如果我使用 @setDatamember 并使用粗箭头,我仍然会遇到 this 不指代正在构造的对象的问题。 =/
    • 抱歉,没有测试就快速回答。像上面一样尝试在构造函数中调用`@setDatamember()`
    • 小心类方法上的粗箭头 - 它们可能会导致大规模内存问题。在这种情况下,唯一需要粗箭头的是对 someFunction 的回调。
    • @AaronDufour,工作完美。您可能希望将其保留为答案,因此我可以将其标记为这样。谢谢。
    【解决方案2】:

    尝试对匿名函数使用粗箭头:

    setDatamember: ->
      someFunction (response) =>
        @datamember = response
        @emit 'init'
    

    另外,您需要在构造函数中调用正确的函数:

    constructor: ->
      @setDatamember()
    

    一般来说,避免在方法上使用粗箭头——Coffee-Script 实现这一点的方式对内存使用有一些不好的影响。此外,它很少需要。

    但是,引用this 的匿名函数几乎总是需要粗箭头。 this 不像普通变量那样保持在闭包中,只能通过绑定 (Function.prototype.bind) 或通过将其作为对象方法调用来设置(obj.myMethod() 将在 myMethod 中将 this 设置为 obj) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2023-03-03
      • 2020-09-27
      相关资源
      最近更新 更多