代码之家  ›  专栏  ›  技术社区  ›  dodov

有很多不可变的对象还是一些可变的对象?

  •  0
  • dodov  · 技术社区  · 3 年前

    我有一个 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的上下文中 ,是否有具体的理由选择其中一个,或者性能差异可以忽略不计?

    0 回复  |  直到 3 年前