鉴于此
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 = {}
答案 0 :(得分:2)
您的opt对象是通过原型共享的,您可以直接在实例中覆盖它,但如果您更改其中的对象,您实际上会更改原型对象(静态行为)。在使用coffeescript类时理解原型非常重要。
我认为初始化实例成员的最佳方法是在构造函数中,就像你在做atm一样。
答案 1 :(得分: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()
答案 2 :(得分:0)
如果“opt”应该作为静态附加到类
class A
@opt: {}
init: (param) ->
# the rest is ommitted