我是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;
}
}
答案 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
时都不会调用构造函数。