JavaScript:类init函数提前返回时,内部对象是否分配内存?
单例模式内存分配问题解答
问题1:当X类的init函数提前返回时,其内部的对象是否会分配内存?
不会。JavaScript/TypeScript的代码是顺序执行的,在init方法中,如果this.smth已经存在,if判断会成立并直接return,此时return语句之后的代码(包括const smth = {x:1}这行对象创建代码)根本不会被执行,自然不会为这个对象分配内存。
问题2:若会分配,能否通过getInstance方法避免该内存分配?
结合问题1的结论,这种场景下本来就不会产生多余的内存分配。但你提供的getInstance写法存在逻辑冗余:既然已经判断this.smth存在,直接返回它就好,没必要再调用init——init本身已经包含了实例存在时直接返回的逻辑,重复调用不会带来额外好处,反而多了一层函数调用开销。
优化后的getInstance可以改成这样:
public static getInstance(): Smth { if (!this.smth) { throw new Error("Not initialized"); } return this.smth; }
完整代码示例
class X { private static smth: Smth public static init(): Smth { // 实例已存在则直接返回 if (this.smth) { return this.smth; } // 仅当实例不存在时才创建对象并分配内存 const smth: Smth = { x: 1 } this.smth = smth return this.smth } public static getInstance(): Smth { if (!this.smth) { throw new Error("Not initialized"); } return this.smth; } } type Smth = { x: number }
内容的提问来源于stack exchange,提问作者ZiiMakc
相关产品推荐
相关产品推荐

