我正在为Ubersicht编写一些小部件。它使用node.js服务器并将每个.coffee
文件视为独立的窗口小部件对象。我在定义要在整个文件中使用的常量设置时遇到问题。目前我知道有两种方法可以在文件顶部定义这种类型的常量。
# 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赋值的工作方式,因为该文件实质上是定义一个对象。你能解释一下吗?
还有一种方法可以定义一个可以从两个地方访问的变量吗?
答案 0 :(得分: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
的范围。 <{1}}在c
的定义中可见,但在其他任何地方都不可见。
C
是原型上的另一个属性,在JavaScript中看起来像这样:
d
此赋值发生在用于构建类的SIF包装器内,因此C.prototype.d = c
在此处可见。
var c = 11
是一个类属性,在JavaScript中只是:
e
C.e = 23;
是原型上的另一个属性。 f
在此上下文中就是类本身(就像在@
中一样):
b
所以我们可以f: @e
作为e
,JavaScript看起来像:
@e
C.prototype.f = C.e;
和g
方法应该非常明确。 h
方法有效,因为它是SIF内部用于定义i
的闭包:
C
C.prototype.i = function() { return c; };
方法有效,因为它使用标准constructor
property返回j
本身。
演示:http://jsfiddle.net/ambiguous/tg8krgh2/
将所有这些应用到您的情况中,
C
如果您正确引用了某些内容,我们会发现您可以使用这两种方法:
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
内引用foo_1
时遇到问题,它应该可以正常工作,does work fine使用当前版本的CoffeeScript。