我正在学习CoffeeScript,我有一个小麻烦,我还没弄清楚。如果我创建一个对象来做某些事情,我偶尔需要一个实例变量来在该方法之间共享该对象。例如,我想这样做:
testObject =
var message # <- Doesn't work in CoffeeScript.
methodOne: ->
message = "Foo!"
methodTwo: ->
alert message
但是,您无法在CoffeeScript中使用var
,如果没有该声明,message
仅在methodOne
内可见。那么,如何在CoffeeScript中的对象中创建实例变量?
更新:修复了我的示例中的拼写错误,因此方法实际上是方法:)
答案 0 :(得分:12)
你不能那样。引用language reference:
因为您无法直接访问var关键字,所以无法有意地隐藏外部变量,您只能引用它。因此,如果您正在编写一个深层嵌套的函数,请注意不要意外地重用外部变量的名称。
然而,您在JS中尝试做的事情也是不可能的,它等同于
testObject = {
var message;
methodOne: message = "Foo!",
methodTwo: alert(message)
}
这是无效的JS,因为你不能在这样的对象中声明一个变量;您需要使用函数来定义方法。例如在CoffeeScript中:
testObject =
message: ''
methodOne: ->
this.message = "Foo!"
methodTwo: ->
alert message
您还可以使用@
作为“此”的快捷方式,即@message
代替this.message
。
或者考虑使用CoffeeScript的class syntax:
class testObject
constructor: ->
@message = ''
methodOne: ->
@message = "Foo!"
methodTwo: ->
alert @message
答案 1 :(得分:5)
只是为了添加@ Lauren的答案,你想要的基本上是module pattern:
testObject = do ->
message = null
methodOne = ->
message = "Foo!"
methodTwo = ->
alert message
return {
methodOne
methodTwo
}
其中message
是仅适用于这些方法的“私有”变量。
根据上下文,您还可以在对象之前声明消息,以便它可用于两个方法(如果在此上下文中执行):
message = null
testObject =
methodOne: -> message = "Foo!"
methodTwo: -> alert message
答案 2 :(得分:1)
您可以使用以下内容定义属性:
message: null
但是,您目前没有定义方法 - 您需要 ->
。
然后,要引用方法中的实例属性,请在属性名称前加上@
。
testObject =
message: null
methodOne: ->
@message = "Foo!"
methodTwo: ->
alert @message
答案 3 :(得分:0)
使用@
指向this
testObject =
methodOne: ->
@message = "Foo!"
methodTwo: ->
alert @message