我有一个
Point
表示的类
x
和
y
协调。一种方法是使该类的属性不可变,并在需要时不断创建新对象,如下所示:
class Point {
readonly x: number;
readonly y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
add(x: number, y: number) {
return new Point(this.x + x, this.y + y);
}
}
document.addEventListener("mousemove", (e) => {
let p = new Point(e.clientX, e.clientY);
let p2 = p.add(24, 42);
// ...
});
另一种方法是预先创建对象并重用它们,例如:
class Point {
x: number;
y: number;
constructor(x?: number, y?: number) {
this.set(x, y);
}
set(x: number, y: number) {
this.x = x;
this.y = y;
}
add(x: number, y: number) {
this.set(this.x + x, this.y + y);
}
copy(p: Point) {
this.set(p.x, p.y)
return this;
}
}
let p = new Point();
let p2 = new Point();
document.addEventListener("mousemove", (e) => {
p.set(e.clientX, e.clientY);
p2.copy(p).add(24, 42)
// ...
});
我的理论是,既然JavaScript是垃圾收集的,那么遵循第一种模式并喷出对象应该不是问题,只要你不留下对它们的引用。然而,我研究了流行的Three.js库是如何实现其
Vector2 object
它基本上和我上面展示的一样,它遵循第二种模式。
第一种方法看起来更易于维护和使用,但第二种方法可能更节省内存?
当谈到一般的设计模式时,很大程度上可以归结为偏好和意见。我的问题是,
在JavaScript的上下文中
,是否有具体的理由选择其中一个,或者性能差异可以忽略不计?