我有一个有点愚蠢的问题。例如,我有这样的代码。
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
因为你覆盖了 instance
每次创建数据库后,才检查是否有问题。Database.instance
是真理性的,当然,你要返回它(新实例)
因为 instance
属性存储了到主创建的 Database
类,并通过调用赋值 Database.instance = this;
先验明正身 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
在第一种情况下,如果一个实例已经存在,你将直接返回。所以第二个实例不是用 ('Jonh Doe', '1234567890')