Javascript单例dilema

Javascript单例dilema,javascript,singleton,Javascript,Singleton,我有个愚蠢的问题。例如,我有如下代码: class Database { constructor(name, password) { this.name = name; this.password = password; if (Database.instance) { return Database.instance; } Database.instance = this; } } const db1 = new Databa

我有个愚蠢的问题。例如,我有如下代码:

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

因为您覆盖了
instance
数据库的每次创建,并且只有在这之后才检查
Database.instance
是否真实,当然,您会返回它(新实例)

因为您覆盖了
实例
数据库的每次创建,并且只有在这之后,才检查
数据库.instance
是否真实,当然,您会返回它(新实例)因为
实例
属性存储链接到
数据库
类的主创建实例,并通过调用赋值
数据库.instance=this
在检查existese
实例
属性之前,您正在覆盖对主要创建实例的现有引用,因此后续检查
实例
属性的存在没有意义,因为新创建的实例已返回。

因为
实例
属性存储链接到
数据库
类的主创建实例,并通过调用赋值
数据库.instance=this
在检查existese
instance
属性之前,您正在覆盖对主要创建实例的现有引用,因此后续检查
instance
属性的存在是没有意义的,因为新创建的实例返回了。

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

     //These two are different instances
    const db1 = new Database('Valentino Rossi', '987654321');
    const db2 = new Database('Jonh Doe', '1234567890');
     console.log(db1 === db2); // false

在第一种情况下,如果已经存在实例,则直接返回。因此,第二个实例不是使用
('john Doe','1234567890')
创建的。在第二种情况下,您要做的是:首先使用
('Valentino Rossi','987654321')
创建一个实例。然后,再次使用
创建另一个实例('Jonh Doe','1234567890')
。因此,两者都是不同的

     //These two are different instances
    const db1 = new Database('Valentino Rossi', '987654321');
    const db2 = new Database('Jonh Doe', '1234567890');
     console.log(db1 === db2); // false

在第一种情况下,如果实例已经存在,则直接返回。因此,第二个实例不是使用
('Jonh Doe','1234567890')

创建的。第二个实例总是更改
数据库的内容。实例
。第一个实例只更改一次。第二个实例总是更改
数据库的内容。实例
。第一个实例只更改一次。