2012-06-25 87 views
2

說我有一個CoffeeScript的類是這樣的:CoffeeScript的類和變量

class Foo 
    aVar = 'foo' 

    someFunction = -> 
     anotherVar = 'bar' 

是否有設置anotherVar爲類變量,而無需將其聲明爲空,像這樣的方式:

class Foo 
    aVar = 'foo' 
    anotherVar = null 

    someFunction = -> 
     anotherVar = 'bar' 

回答

2

不,你不能。讓我們來看一個簡單的類:

class C 
    cv = null 
    m: -> cv 

,能轉化爲這個JavaScript:

var C = (function() { 
    var cv; 
    function C() {} 
    cv = null; 
    C.prototype.m = function() { 
    return cv; 
    }; 
    return C; 
})(); 

你會發現,「私有類變量」 cv只是自我內部的局部變量執行功能,建立C。因此,如果我們想要向C添加一個新的「私人類變量」,我們必須再次打開該匿名函數的範圍並添加新變量。但是無法及時回溯並改變已經執行的功能的範圍,因此您運氣不佳。

定義它時,您不必將anotherVar定義爲null,但必須將其初始化爲某種東西。

+0

Lame,我認爲可能有一種方法,就像你可以通過預先加入@來做靜態變量一樣;好吧! –

0

您有沒有聽說過this關鍵字? :) CoffeeScript的映射@this

class Foo 
    aVar = 'foo' 

    someFunction: -> 
     @anotherVar = 'bar' 
+0

但是,這使得它成爲'公共'(靜態)變量,我希望它是'私人',例如,因爲它只存在於班級內並且可以訪問。 –

+1

JavaScript中沒有* private *變量。那是一回事。第二個:'someFunction'映射到'Foo'的'prototype'屬性。你上面寫的代碼甚至不起作用。原型函數只能訪問'this'上下文中的變量。如果你想使用* private *變量,那麼你必須在前綴'@'的'Foo'的構造函數中定義'someFunction'。 – freakish

+0

Woops!我更新了我的問題以反映「someFunction」的重寫。 –