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
在检查existeseinstance
属性之前,您正在覆盖对主要创建实例的现有引用,因此后续检查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')
创建的。第二个实例总是更改数据库的内容。实例
。第一个实例只更改一次。第二个实例总是更改数据库的内容。实例
。第一个实例只更改一次。