2

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

我想知道这段代码red中的变量会发生什么。Red 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;
    }
}
4

3 回答 3

9

其他答案是完全正确的,但我认为他们没有提到一个微妙的问题。因为 Red 被定义为一个 getter,所以它也会自动获得一个什么都不做的空 setter。因此,当您调用时,您Color.Red = function() { return red; }将该函数传递给 Color.Red 的设置器,它什么也不做,因此该语句无效。您可以将 analert()放入 getter 并调用几次以亲自查看。

如果您查看为这篇文章生成的 JavaScript,您会发现 getter 是通过Object.defineProperty创建的,这是一个有趣的野兽。您可以自己调用 Object.defineProperty 来重新定义 getter 的操作,但是当private static red : Color = new Color(255,0,0);工作正常时,这似乎需要做很多工作。

至于哪个最好,这是一个取舍的问题,什么对你更重要。总是返回一个新的对象会消耗更多的内存,但避免了有人修改 Color.Green 并导致追踪一个有趣的错误的风险。

于 2013-04-11T15:25:56.453 回答
2

如果你想缓存它,你可以这样做:

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

于 2013-04-11T06:45:06.973 回答
1

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

于 2013-04-10T22:54:00.447 回答