CoffeeScript特定的类变量访问器

时间:2014-04-30 12:25:49

标签: javascript coffeescript

我意识到在CoffeeScript @someVar translatedthis.someVar。是否有任何类似的运算符可用于访问类成员?请考虑以下示例:

class @SleepTracking
  @sleepQualities = ["none", "nervous", "quiet"]
  @timeFormat = "H:mm:ssZ"

  constructor: (value) ->
    # Initialization

  doSomething: ->
    # How to access timeFormat except using SleepTracking.timeFormat ?

除了timeFormat之外,还有其他方法可以访问类函数中的SleepTracking.timeFormat吗?

更新

变量是使用@定义的,因此可以在类的范围内使用它们而无需实例化类。例如:

someFunction = () ->
  validQuality = SleepTracking.sleepQualities
  # Do something

3 个答案:

答案 0 :(得分:0)

class SleepTracking
  @sleepQualities = ["none", "nervous", "quiet"]
  @timeFormat = "H:mm:ssZ"

  constructor: (value) ->
    @timeFormat = SleepTracking.timeFormat

  doSomething: ->
    @timeFormat

st = new SleepTracking()

console.log SleepTracking.timeFormat
console.log st.doSomething()

最近我可以看到你做的是这样的事情。它为您提供对变量的静态访问,但也允许在实例化类的函数内使用。你必须设置构造函数属性有点垃圾:(

转到http://coffeescript.org/Try Coffeescript标签即可开始使用。

答案 1 :(得分:0)

您可以使用constructor property来获取“课程”:

  

返回对创建实例原型的Object函数的引用。请注意,此属性的值是对函数本身的引用,而不是包含函数名称的字符串。

所以给出这样的东西:

class C
    m: -> ...

您可以查看@constructor内的m并获取C。请注意,这正确处理子类化,因此:

class C
    @cp = 11
    m: -> console.log(@constructor.cp)
class D extends C
    @cp = 23
class E extends C

(new C).m()
(new D).m()
(new E).m()

将11,23和11转储到控制台(demo)。

在你的情况下,你会有这样的事情:

doSomething: ->
    format = @constructor.timeFormat
    #...

答案 2 :(得分:0)

  

除了SleepTracking.timeFormat之外,还有其他方法可以在类函数中访问timeFormat吗?

我不这么认为。但是,您可以为它们使用类范围的别名:

class @SleepTracking
  sleepQuals = @sleepQualities = ["none", "nervous", "quiet"]
  @timeFormat = "H:mm:ssZ"
  consts = @

  doSomething: ->
    SleepTracking.timeFormat === consts.timeFormat
    SleepTracking.sleepQualities === sleepQauls

变量(sleepQuals)方法最适合常量(或对可变对象/数组的常量引用),而类名别名(consts)只是名称缩短和简化重命名班上的。但我认为写SleepTracking只是最不容易混淆。