Javascript单字节困境

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

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

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

这个控制台.日志将返回true,所以这是一个单人.但如果我改变唯一的地方,我定义Database.instance =这个;像下面一样,它不会工作.你能向我解释为什么会发生这种情况,好吗?

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
3个回答
0
投票

因为你覆盖了 instance 每次创建数据库后,才检查是否有问题。Database.instance 是真理性的,当然,你要返回它(新实例)


0
投票

因为 instance 属性存储了到主创建的 Database 类,并通过调用赋值 Database.instance = this; 先验明正身 instance 属性,您会覆盖现有的对主创建实例的引用,因此后续检查是否存在 instance 属性是没有意义的,因为新创建的实例返回。


0
投票

在第二种情况下,你要做的是这样的。首先创建一个带有 ('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')

© www.soinside.com 2019 - 2024. All rights reserved.