2013-02-23 96 views
-1

我有一個類Child它延伸Test。我想從Child調用Test的功能。運行方法參考它的兒童類的靜態變量

我嘗試這樣做:

class Test 
    constructor: -> 
     @i = 'hello world' 

    f1: -> console.log @i 
    f2: -> console.log 'hello' 

class Child extends Test 
    run: -> 
     Test::f1() 

hello = new Child() 
hello.run() 

當我打電話hello.run(),它調用Test.f1(),但結果是undefined。在運行之前,不會將靜態變量@i設置爲Test.f1()

如果我切換Test::f1()Test::f2(),它會給我正確的結果。

我需要知道我應該怎麼做Testconstructor運行,當我創建一個new Child()使@iTest定義,當我從Child.run()運行Test::f1()

謝謝! :d

回答

0

下面是做這件事的一種方法:

class Test 
    @i: 'hello world' 

    @f1: -> console.log @i 
    f2: -> console.log 'hello' 

class Child extends Test 
    run: -> 
    Test.f1() 

hello = new Child() 
hello.run() 

通知,i變量是靜態的,所以也沒有意義的設置它在構造函數中。此外,f1方法現在也是靜態的。

(我不是CoffeeScript的專家,所以我不知道需要爲::語法是什麼。)

+0

'::'是'.prototype.'的縮寫 – 2015-01-29 23:54:10

0

構造正在運行時創建的Child一個新的實例。問題是你調用f1的方式。

你不想說Test::f1()。你可以說@f1(),因爲ChildTest的子類。這些在一個非常重要的方式是不同的:Test::f1()不設置this,所以當該功能請求this.i時,它只發現undefined,因爲this設置爲Window(或在瀏覽器中這樣的荒謬,不知道你是否運行這在Node中)。說@f1()就像說Test::f1.call(this)一樣。這是CoffeeScript的課程系統允許你做的很好的事情之一。

最後,一個迂腐的筆記:你寫的代碼中沒有靜態變量。就像你寫的那樣,它是一個實例變量。靜態變量是這樣的:

class Test 
    @staticVar = 1234 

或者這樣:

class Test 
    # ... 

Test.staticVar = 1234 

實例變量是這樣的:

class Test 
    fn: -> 
    @instanceVar = 1234 

或者這樣:

test = new Test() 
test.instanceVar = 1234 

甚至像這樣(對於inst的默認值所有實例中共享ANCE變量):

Test::instanceVar = 1234 

與此類似:

當我打電話hello.run(),它調用Test.f1(),但結果是undefined。在運行之前,不會將靜態變量@i設置爲Test.f1()

你永遠叫Test.f1();你叫Test::f1(),這是非常不同的。在你寫的代碼中,有沒有Test.f1,只有Test.prototype.f1