Javascript单例困境

问题描述 投票:0回答:2

我有一个愚蠢的问题。例如,我有这样的代码:

class Database {
  constructor(name, password) {
    this.name = name;
    this.password = password;

    if (Database.instance) {
      return Database.instance;
    }

    Database.instance = this;
  }
}


const db1 = new Database('Valentino Rossi', '987654321');
const db2 = new Database('Jonh Doe', '1234567890');
console.log(db1 === db2); // true

此console.log将返回true,因此这是一个单例。但是,如果我更改定义Database.instance = this的唯一位置;如下所示,它将无法正常工作。您能告诉我为什么会这样吗?

class Database {
  constructor(name, password) {
    this.name = name;
    this.password = password;

    Database.instance = this;

    if (Database.instance) {
      return Database.instance;
    }
  }
}


const db1 = new Database('Valentino Rossi', '987654321');
const db2 = new Database('Jonh Doe', '1234567890');
console.log(db1 === db2); // false
javascript singleton
2个回答
0
投票

因为您覆盖每次创建数据库的instance,只有在那之后检查Database.instance是否为真,因此您将其返回(新实例


0
投票

因为instance属性存储了指向Database类的主要创建实例的链接,并且在检查existense Database.instance = this;属性之前调用了赋值instance,因此您覆盖了对主要创建的实例的现有引用,因此随后检查了instance的存在]属性没有意义,因为返回了新创建的实例。


0
投票

在第二种情况下,您正在做的是:首先使用('Valentino Rossi', '987654321')创建一个实例。然后,再次使用('Jonh Doe', '1234567890')创建另一个实例。因此,两者是不同的。

    const db1 = new Database('Valentino Rossi', '987654321');
const db2 = new Database('Jonh Doe', '1234567890');
console.log(db1 === db2); // false
© www.soinside.com 2019 - 2024. All rights reserved.