如何使用set方法通过coffeescript中的构造函数初始化实例变量

时间:2013-09-10 22:53:43

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

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

  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),我还没有发现任何涉及此事的内容。

2 个答案:

答案 0 :(得分:3)

尝试使用胖箭头作为匿名函数:

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

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

constructor: ->
  @setDatamember()

一般来说,避免在方法上使用胖箭头 - Coffee-Script实现此方法会对内存使用造成一些不好的影响。此外,它很少是必要的。

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

答案 1 :(得分:2)

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

 class MyClass
    constructor: ->
      @setDatamember()

    setDatamember: =>
      someFunction (response) =>
        @datamember = response

    getDatamember: =>
      return @datamember

但是,您还希望将someFunction作为异步函数放在那里,这样您就永远无法做到

mc = new MyClass
console.log mc.datamember

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