我有一个愚蠢的问题。例如,我有这样的代码:
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
属性存储了指向Database
类的主要创建实例的链接,并且在检查existense Database.instance = this;
属性之前调用了赋值instance
,因此您覆盖了对主要创建的实例的现有引用,因此随后检查了instance
的存在]属性没有意义,因为返回了新创建的实例。
在第二种情况下,您正在做的是:首先使用('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