2012-10-19 23 views
3

在CoffeeScript的,如果我在類的構造函數定義一個實例屬性,該屬性可以參考其它實例屬性中的定義,例如:在類級別聲明在CoffeeScript中,在類級別聲明的實例屬性是否可以在其定義中引用另一個實例屬性?

class Foo 
    constructor: (data) -> 

     @One = 1 

     @Two = @One + 1 

但對於實例屬性?以下不起作用:

class Foo 

    One: 1 

    Two: @One + 1 

在這種情況下,@符號指的是'類'本身,而不是實例。同樣,簡單地刪除@不起作用。

有沒有一種方法,在類級別聲明的一個實例屬性可以在其定義中引用另一個實例屬性?

回答

4

當你這樣說:

class Foo 
    one: 1 

你在Foo設置one的原型,所以你只需要看看@的原型要回哪裏one是:

class Foo 
    one: 1 
    two: @::one + 1 

Demo

請注意,這甚至適用於子類,所以你這樣做:

class Pancakes extends Foo 
    three: @::two + 1 

你會得到預期的三個。

+0

啊,不知道雙冒號的語法(顯然)。謝謝。 –

+0

@DanielPratt:看看文檔的[Classes,Inheritance and Super](http://coffeescript.org/#classes)部分的底部,這裏只提一點。 –

+0

@DanielPratt'::'只是'.prototype'的語法糖 – epidemian

1

是的,你可以使用一個輔助變量爲:

class Foo 
    uno = 1 
    One: uno 
    Two: uno + 1 

(變量也可以稱爲One,我只是用另一個名字從財產相區別)

但是請記住, ,這些屬性將在Foo的原型中,而不是Foo的「類」本身。這是生成的JS:

var Foo; 

Foo = (function() { 
    var uno; 

    function Foo() {} 

    uno = 1; 

    Foo.prototype.One = uno; 

    Foo.prototype.Two = uno + 1; 

    return Foo; 

})(); 

如果你想他們是類屬性,你可以在類級別使用@:

class Foo 
    @One = 1 
    @Two: @One + 1 

這樣,你可以訪問這些爲Foo.OneFoo.Two

+0

感謝您花時間回覆。我給了你一個贊成票,但我接受了穆的回答,因爲它離我想要的更近一點。 –

+1

@DanielPratt酷。是的,穆的回答比較好;我沒有想過那個:)。無論哪種情況,我都認爲你並沒有在這些屬性上加上'1'和'2',而是更有趣的東西,所以記住,不管你放在原型上的東西是否會在實例之間共享(所以要小心可變的東西)。 – epidemian

相關問題