2013-04-10 56 views
1

我是JavaScript新手,因爲我來自強類型語言,所以我選擇了TypeScript。Typescript - 靜態屬性創建優化

我想知道在此代碼中變量redRed getter中會發生什麼。是否會在每次通話時重新創建(如Green getter)或創建一次並每次使用?哪個最好?

class Color { 
    public R: number; 
    public G: number; 
    public B: number; 
    public A: number; 

    static get Red(): Color { 
     var red = new Color(255, 0, 0); 
     Color.Red = function() { return red; } 
     return red; 
    } 

    static get Green(): Color { 
     return new Color(0, 255, 0); 
    } 

    constructor(red: number, green: number, blue: number, alpha: number = 255) { 
     this.R = red; 
     this.G = green; 
     this.B = blue; 
     this.A = alpha; 
    } 
} 

回答

6

其他答案是完全正確的,但我認爲有一個微妙的問題,他們沒有提及。因爲Red被定義爲一個getter,它也會得到一個不執行任何操作的自動空setter。所以當你打電話給Color.Red = function() { return red; }時,你將這個函數傳遞給Color.Red的setter,它什麼都不做,所以這個語句沒有任何作用。你可以將一個alert()打入吸氣者,並多次呼籲自己看看。

如果你看看爲這件作品生成的JavaScript,你會看到通過Object.defineProperty創建了一個有趣的野獸。你可以自己調用Object.defineProperty來重新定義getter的動作,但private static red : Color = new Color(255,0,0);工作得很好時,這似乎很多工作。

至於哪一個最好,這是一個權衡問題,對你來說更重要。總是返回一個新的對象將消耗更多的內存,但是避免了修改Color.Green並導致有趣錯誤追蹤的風險。

+0

+1不錯的完整答案。 – Fenton 2013-04-12 09:57:42

0

每次使用getter時,調用實現它的函數。 Red實現不會完成任何類型的緩存。

1

如果你想獲得它的緩存可以這樣做:

class Color { 
    public R: number; 
    public G: number; 
    public B: number; 
    public A: number; 

    private static _red : Color = new Color(255,0,0); 
    static get Red(): Color { 
     return _red; 
    } 

    static get Green(): Color { 
     return new Color(0, 255, 0); 
    } 

    constructor(red: number, green: number, blue: number, alpha: number = 255) { 
     this.R = red; 
     this.G = green; 
     this.B = blue; 
     this.A = alpha; 
    } 
} 

這樣的構造是不是每次使用Red時調用。