【问题标题】:Public class members in coffeescriptCoffeescript 中的公共类成员
【发布时间】:2011-12-14 03:43:13
【问题描述】:

我对coffeescript 很陌生,我一直在尝试找到一种方法来让班级成员可以公开访问。如果我运行以下代码:

class cow
  n = 7
  moo: -> 
    alert("moo")

bessie = new cow
alert(bessie.n);

它将显示bessie.n 未定义。我能找到的唯一解决方案是制作像n: -> nsetN: (value) -> n = value 这样的getter 和setter。然后我必须使用函数调用而不是简单的属性访问。对于一种基于语法糖来推销自己的语言来说,这感觉很麻烦。

我在文档中遗漏了什么可以更轻松地使用简单的公共成员创建类吗?这方面的最佳做法是什么?

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    和设置方法没什么区别。

    试试这个

    class cow
      n: 7
    

    只做

    class cow
      n = 7
    

    只会在类闭包中设置私有变量。

    使用http://coffeescript.org/ 上的try coffeescript 链接查看它的编译结果。

    【讨论】:

    • 我把n=7 放进去初始化它,但现在我发现这更类似于私有变量。 n: 7 更像是一个属性。谢谢!
    • 另请注意,设置“n = 7”对类的所有实例都是通用的。
    • 所以它就像一个私有静态?很高兴知道。
    • 没错。有趣的事实:class 是在 CoffeeScript 中创建函数的唯一方法,除了 ->=>。与->=> 不同,该函数会立即运行,但在其他方面是正常的。只有当您使用键值语法: 来定义原型属性(和constructor)时,它的特殊性才会显现出来。
    【解决方案2】:

    当您需要私有成员时,通常不能使用私有静态成员来代替。

    私有变量的概念很容易通过 Crockfords 的建议来实现,但这不是一个合适的 CoffeeScript 类,因此你不能扩展它。赢家是你得到一个对象,它的方法没有其他人可以读/写你的变量,使它更简单一点。请注意,您不要使用“new”关键字(无论如何,Crockford 认为这是一种不好的做法)

    Counter = (count, name) ->
        count += 1
        return {
            incr : ->
                count = count + 1
            getCount : ->
                count
        }
    
    c1 = Counter 0, "foo"
    c2 = Counter 0, "bar"
    c3 = Counter 0, "baz"
    
    console.log c1.getCount() # return 1 regardless of instantiation number
    console.log c1.count # will return undefined
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2013-10-10
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多