2014-12-07 72 views
1

我正在为Ubersicht编写一些小部件。它使用node.js服务器并将每个.coffee文件视为独立的小部件对象。我在定义要在整个文件中使用的常量设置时遇到问题。目前我知道两种在文件顶部定义这种常量的方法。coffeescript变量赋值的范围与对象其他属性中的属性赋值

# Way 1 
foo_1 = true 
bar_1 = false 
# Way 2 
foo_2: true 
bar_2: false 

进一步向下在同一个文件中,属性被分配为字符串或作为函数。以上两种定义选项的方法都只适用于两种属性类型之一。

staticProperty: """Output #{foo_1} works here 
but output of #{foo_2} doesn't work 
""" 

methodProperty: (input) -> 
    if foo_1 # Raises foo_1 is not defined 
    if @foo_1 # foo_1 is undefined which is expected 
    if @foo_2 # This works fine 

我的理解是这样2添加到该对象的属性,但我不太确定的方式分配1如何工作给予该文件基本上是定义对象。你能解释一下吗?

还有一种方法来定义可以从两个地方访问的变量?

回答

2

我们来看一个又大又丑的例子来看看这是怎么回事:

class C 
    a: 6 
    b: @::a 
    c = 11 
    d: c 
    @e = 23 
    f: @e 
    g: -> @a 
    h: -> C::b 
    i: -> c 
    j: -> @constructor.e 

a是一个正常的旧物,在JavaScript中,它看起来像:

C.prototype.a = 6; 

b也是与原型相连的正常旧财产;在这里:

b: @::a 

@是类本身,以便在JavaScript是这样的:

C.prototype.b = C.prototype.a 

,一切工作就好了。

c是一种私人变量。在JavaScript中,它看起来是这样的:

var C = (function() { 
    function C() {} 
    var c = 11; 
    //... 
})(); 

我在这里包含更多的JavaScript上下文,以便您可以看到c的范围。 c对于C的定义内的任何东西都是可见的,但无处可见。

d是另一种属性,它在原型,看起来像这样在JavaScript:

C.prototype.d = c 

该分配用来建造类,所以var c = 11可见这里的SIF包装内发生。

e是一个类属性和JavaScript的只是:

C.e = 23; 

f是在原型的另一个属性。@是类本身在这方面(就像在b):

f: @e 

,所以我们可以在e得到尽可能@e和JavaScript的样子:

C.prototype.f = C.e; 

gh方法应很清楚。该i方法有效,因为它是SIF内封闭用来定义C

C.prototype.i = function() { return c; }; 

j方法有效,因为它使用标准constructor property要回C本身。

演示:http://jsfiddle.net/ambiguous/tg8krgh2/


运用一切都交给你的情况,

class Pancakes 
    foo_1 = true 
    foo_2: true 

我们看到,如果你引用的东西正常,你可以使用两种方法:

staticProperty: """Output #{foo_1} works here 
and so does #{@::foo_2} 
""" 

methodProperty: (input) -> 
    # foo_1 should work fine in here. 
    # @foo_1 is undefined which is expected 
    # @foo_2 works fine 

我'm不知道为什么你有问题引用foo_1我在你的methodProperty之前,它应该可以正常工作,does work fine可以使用当前版本的CoffeeScript。

+0

这是非常丰富和清除了很多东西了。 Ubersicht对该对象做了几件事。首先将.coffee文件作为文本读入并通过'eval'。这不应该是一个问题。我认为这个问题是,对象被复制到一个新的对象,比如'new [k] = v for k,v of old',因此它丢失了所有的私有变量。这就是为什么'foo_1'没有定义。用'@ :: foo_2'尝试''不能读取'undefined'的属性'foo_2'。这我还不明白。 – 2014-12-08 18:50:04

+0

“@ :: foo_2”错误可能是由于某些情况下的复制造成的,如果Ubersicht只是用'for ... of'循环复制属性,那么你将失去原型的跟踪(AKA'@ :: ')。如果它将方法视为普通函数,它也可能会丢失“@”的踪迹。 – 2014-12-08 19:56:15