【问题标题】:CoffeeScript specific accessor for class variables类变量的 CoffeeScript 特定访问器
【发布时间】:2014-05-01 01:13:46
【问题描述】:

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

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

  constructor: (value) ->
    # Initialization

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

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

更新:

变量是使用@ 定义的,因此可以在不实例化类的情况下在类的范围之外使用它们。例如:

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

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:
    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 选项卡试试看。

    【讨论】:

    • 我也想在类外使用变量,所以删除@真的对我没有帮助!
    • 你需要它们作为静态变量吗?如果你正在更新你正在使用它的类,你将能够使用sleepTracking.timeFormat从外部访问它们
    • 因为我不是班级的范围,我想我是。还是我在这里遗漏了什么?
    • 非常感谢您在这里所做的努力。但我的想法是能够在不实例化类的情况下使用这些变量。我会更新问题以使其更清楚。
    • 好的,我已经更新了我的答案,希望对您有所帮助。
    【解决方案2】:

    您可以使用constructor property 进入“课堂”:

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

    所以给定这样的东西:

    class C
        m: -> ...
    

    您可以在m 中查看@constructor 并获取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
        #...
    

    【讨论】:

      【解决方案3】:

      除了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 是最不容易混淆的。

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 2012-03-10
        相关资源
        最近更新 更多