2012-04-12 93 views
10

我學習的CoffeeScript,和我有一個輕微的頭痛我還不太能弄清楚。如果我創建一個對象來做某些事情,我偶爾需要一個實例變量來爲該對象在方法之間共享。舉例來說,我想這樣做:CoffeeScript的實例變量

testObject = 

    var message # <- Doesn't work in CoffeeScript. 

    methodOne: -> 
    message = "Foo!" 

    methodTwo: -> 
    alert message 

但是,你不能在CoffeeScript中使用var,並且沒有聲明message只是內部methodOne可見。那麼,如何在CoffeeScript中的對象中創建實例變量?


更新:在我的例子固定錯字所以這些方法實際上是方法:)

+0

順便說一句,我知道我能做到'的消息=「 「',但我真的只是希望變量爲空,所以我可以根據存在設置行爲,而不是更復雜的檢查,看看它是不是」空白「等。 – Andrew 2012-04-12 21:25:53

+0

你也可以設置'message = null'這是什麼你不想要? – Sandro 2012-04-12 21:34:40

+0

當我嘗試'message = null'時,我得到'ParseError Unexpected'TERMINATOR'' – Andrew 2012-04-12 21:41:31

回答

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 

您還可以使用@作爲快捷方式的this.message「這個」,即@message代替。

或者考慮使用CoffeeScript中的class syntax

class testObject 
    constructor: -> 
     @message = '' 

    methodOne: -> 
     @message = "Foo!" 

    methodTwo: -> 
     alert @message 
+0

很好的例子,謝謝! – Andrew 2012-04-12 21:44:02

1

您可以定義屬性:

message: null 

但是,你是不是現在定義方法 - 您需要->

然後,參考實例屬性的方法中,用@前綴屬性名。

testObject = 

    message: null 

    methodOne: -> 
    @message = "Foo!" 

    methodTwo: -> 
    alert @message 
+0

' - >'不是必需的:參見[my fixed version](http://coffeescript.org/#try:testObject%20%3D%20%0A%0A%20%20methodOne%3A%0A%20% 20%20%20%40%消息%20%3D%20%22Foo!%22%0A%0A%20%20methodTwo%3A%0A%20%20%20%20%20%40message) – 2012-04-12 21:31:55

+0

@KristofferSHansen your version isn' t固定;正如你可以通過在該頁面上按'運行'所看到的那樣,它會立即顯示一個警告對話框,這可能不是安德魯之後的事情,更可能是他希望推遲執行直到該方法被調用。 – Lauren 2012-04-12 21:34:48

+0

@KristofferSHansen它用於功能/方法。沒有它,'methodTwo'被設置爲調用'alert'的結果,而不是調用'alert'的函數。 – 2012-04-12 21:35:08

5

只需添加到@勞倫的答案,你想基本上是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 
+0

感謝您的額外信息,這是有幫助的! – Andrew 2012-04-13 02:20:52

+0

正確,但是你的代碼有點bug:'do'只會創建一個閉包,所以你不能定義屬性,而應該使用變量('methodOne = - > ...'等)。另外,return語句應該可能是'{methodOne:methodOne,methodTwo:methodTwo}'。當然你可以把你的方法定義放入return語句中去。 – 2012-04-16 22:28:20

+1

@JulianD。 * copy&pasta * :) return語句使用[解構賦值](http://coffeescript.org/#destructuring)。 – 2012-06-21 07:39:17