2013-04-10 2 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로 정의되기 때문에 아무것도 수행하지 않는 자동 empty setter를 얻습니다. 따라서 Color.Red = function() { return red; }으로 전화를 걸면 해당 기능을 Color.Red에 대한 설정자로 전달합니다.이 기능은 아무 작업도 수행하지 않으므로 아무런 효과가 없습니다. 너는 alert()을 getter로 때리고 그것을 몇 번 불러서 직접 볼 수있다.

이 작품에 대해 생성 된 자바 스크립트를 보면 재미있는 짐승 인 Object.defineProperty을 통해 게터가 생성된다는 것을 알 수 있습니다. getter의 동작을 재정의하기 위해 Object.defineProperty를 직접 호출 할 수도 있지만 private static red : Color = new Color(255,0,0);이 완벽하게 작동하면 많은 작업이있는 것처럼 보입니다.

가장 좋은 점은 트레이드 오프와 더 중요한 점입니다. 항상 새로운 Object를 반환하면 더 많은 메모리를 사용하지만 Color.Green을 수정하고 재미있는 버그를 추적하여 추적하는 위험을 피할 수 있습니다.

+0

+1 멋진 답변입니다. – Fenton

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 사용할 때마다 호출되지 않습니다 이쪽으로.