2

鉴于这种

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而不是实例ab。如何初始化实例变量而不必将它们放入构造函数中?像这样:

class A
   constructor: ->
      @opt = {}

编辑:

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

class B
   constructor: ->
      console.log "i won't happen"
class A extends B
   constructor: ->
      console.log "i will happen"
      @opt = {}
4

3 回答 3

2

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

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

于 2012-09-06T18:10:00.587 回答
1

好的,在构造函数中启动所有类成员并记住super()在子类构造函数中调用解决了它......

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

    new A()
于 2012-09-19T12:05:00.090 回答
0

如果“opt”应该作为静态附加到类

class A
    @opt: {}
    init: (param) ->
        # the rest is ommitted
于 2012-09-06T15:26:29.817 回答