我正在为Ubersicht编写一些小部件。它使用节点.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 赋值的工作方式,因为该文件本质上是在定义一个对象。你能解释一下吗?
还有没有办法定义可以从两个地方访问的变量?
我们将看一个丑陋的大例子,看看发生了什么:
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
此赋值发生在用于构建类的 SIF 包装器内,因此var c = 11
在此处可见。
e
是一个类属性,在 JavaScript 中只是:
C.e = 23;
f
是原型上的另一个属性。 在这种情况下,类本身@
(就像在b
中一样(:
f: @e
因此,我们可以e
@e
,JavaScript 如下所示:
C.prototype.f = C.e;
g
和h
方法应该很清楚。i
方法之所以有效,是因为它是 SIF 内部用于定义C
的闭包:
C.prototype.i = function() { return c; };
j
方法之所以有效,是因为它使用标准 constructor
属性返回到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
我不确定为什么您在methodProperty
中引用foo_1
时遇到问题,它应该可以正常工作,并且在当前版本的 CoffeeScript 中工作正常。