【问题标题】:Coffeescript classes and variablesCoffeescript 类和变量
【发布时间】:2012-06-26 01:13:41
【问题描述】:

假设我有一个这样的 Coffeescript 类:

class Foo
    aVar = 'foo'

    someFunction = ->
        anotherVar = 'bar'

有没有办法将anotherVar 设置为类变量而不必将其声明为null,如下所示:

class Foo
    aVar = 'foo'
    anotherVar = null

    someFunction = ->
        anotherVar = 'bar'

【问题讨论】:

    标签: class coffeescript


    【解决方案1】:

    不,你不能。让我们看一个简单的类:

    class C
        cv = null
        m: -> cv
    

    即转换成这个 JavaScript:

    var C = (function() {
      var cv;
      function C() {}
      cv = null;
      C.prototype.m = function() {
        return cv;
      };
      return C;
    })();
    

    您会注意到“私有类变量”cv 只是构建C 的自执行函数内部的一个局部变量。因此,如果我们想向C 添加一个新的“私有类变量”,我们必须再次打开该匿名函数的作用域并添加新变量。但是没有办法回到过去并改变已经执行的函数的范围,所以你运气不好。

    您不必在定义 anotherVar 时将其定义为 null,但您必须将其初始化。

    【讨论】:

    • 蹩脚,我认为可能有一种方法,就像你可以通过添加 @ 来处理静态变量一样;哦,好吧!
    【解决方案2】:

    您听说过this 关键字吗? :) CoffeeScript 将@ 映射到this

    class Foo
        aVar = 'foo'
    
        someFunction: ->
            @anotherVar = 'bar'
    

    【讨论】:

    • 但这使它成为一个“公共”(静态)变量,我希望它是“私有”的,例如因为它只存在于类中并且可以在类中访问。
    • JavaScript 中没有 private 变量这样的东西。那是一回事。第二个:someFunction 映射到Fooprototype 的属性。你上面写的代码甚至都行不通。原型函数只能访问this 上下文中的变量。如果你想使用 private 变量,那么你必须在 Foo 的构造函数中定义 someFunction 并带有 @ 前缀。
    • 糟糕!我已经更新了我的问题以反映 someFunction 的重写。
    • 但是您可以利用函数包装器在某些情况下模拟 privatestackoverflow.com/a/9347993/479863
    • @muistooshort 哦,是的。我忘记了 CoffeeScript 将所有内容再次包装在一个匿名函数中。谢谢你留下我!
    猜你喜欢
    • 2014-09-20
    • 2012-03-10
    • 1970-01-01
    • 2012-04-10
    • 2011-09-26
    • 1970-01-01
    • 2012-02-20
    • 2011-12-27
    • 2012-01-20
    相关资源
    最近更新 更多