Coffeescript 如何在不将实例变量放入构造函数的情况下初始化它们?

Coffeescript 如何在不将实例变量放入构造函数的情况下初始化它们?,coffeescript,Coffeescript,鉴于此 class A opt: {} init: (param) -> console.log "arg is ", @opt.arg @opt.arg = param a = new A() a.init("a") console.log "first", a.opt.arg b = new A() b.init("b") console.log "second", b.opt.arg 这是输出 arg is undefined first

鉴于此

class A
   opt: {}
   init: (param) ->
      console.log "arg is ", @opt.arg
      @opt.arg = param

a = new A()
a.init("a")
console.log "first", a.opt.arg

b = new A()
b.init("b")
console.log "second", b.opt.arg
这是输出

arg is  undefined
first a
arg is  a
second b
变量
opt
作为静态变量,它属于类
a
,而不是实例
a
b
。如何在不将实例变量放入构造函数的情况下初始化它们?像这样:

class A
   constructor: ->
      @opt = {}
编辑:

这在使用继承时是有问题的,因为超级构造函数被覆盖

class B
   constructor: ->
      console.log "i won't happen"
class A extends B
   constructor: ->
      console.log "i will happen"
      @opt = {}
如果“opt”应充当静态对象,则将其附加到类

class A
    @opt: {}
    init: (param) ->
        # the rest is ommitted

您的opt对象是通过原型共享的,您可以直接在实例中覆盖它,但是如果您更改其中的对象,您实际上会更改原型对象(类似静态的行为)。在使用coffeescript类时,理解原型非常重要


我认为初始化实例成员的最好方法是在构造函数中,就像你在做atm一样。

好的,那么,初始化构造函数中的所有类成员并记住在子类构造函数中调用
super()
可以解决这个问题

    class B
       constructor: ->
          console.log "i will also happen"
    class A extends B
       constructor: ->
          super()
          console.log "i will happen"
          @opt = {}

    new A()

您可以通过将实例变量放入构造函数来初始化它们,所以我猜答案是“您没有”。显然Simon不希望它充当静态变量,但不希望在构造函数中初始化它…好的,谢谢您的解释。但是,当使用继承时,使用初始化构造函数会导致问题
class B构造函数:->console.log“我不会发生”class A扩展了B构造函数:->console.log“我会发生”@opt={}
您可以在继承的构造函数中调用
super