Typescript - 静态属性创建优化

EOG*_*EOG 2 javascript typescript

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

我想知道发生了什么变量redRed getter这个代码.它会在每次调用时重新创建(如in 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ski 8

其他答案是完全正确的,但我认为有一个微妙的问题,他们没有提到.因为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被追踪的风险.