TypeScript - 静态属性创建优化

时间:2013-04-10 21:54:13

标签: javascript typescript

我是JavaScript的新手,因为我来自强类型语言,所以我选择了TypeScript。

我想知道此代码中red中变量Red 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;
    }
}

3 个答案:

答案 0 :(得分:7)

其他答案完全正确,但我认为他们没有提及一个微妙的问题。因为Red被定义为getter,所以它也会获得一个无效的自动空setter。因此,当您调用Color.Red = function() { return red; }时,您将该函数传递给Color.Red的setter,它不执行任何操作,因此该语句无效。你可以将一个alert()打入吸气器并调用它几次以便自己查看。

如果您查看为此作品生成的JavaScript,您会看到getter是通过Object.defineProperty创建的,这是一个有趣的野兽。你可以自己调用Object.defineProperty来重新定义getter的动作,但是当private static red : Color = new Color(255,0,0);完全正常时,这似乎很多工作。

至于哪个最好,这是一个权衡问题,对你来说更重要。总是返回一个新的对象会占用更多的内存,但是避免了有人修改Color.Green并导致一个有趣的bug被追踪的风险。

答案 1 :(得分:1)

每次使用getter时,都会调用实现它的函数。 Red实现不会实现任何类型的缓存。

答案 2 :(得分: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时都不会调用构造函数。