在 javascript 中,单例模式与继承机制结合使用的核心做法是:创建一个全局唯一的实例对象,并通过原型链或类继承将其属性与方法共享给其他子类或模块。具体而言,你可以定义一个基类(singletonbase),在其构造函数中确保只生成一个实例,然后让其他类继承该基类,从而复用单例的逻辑和状态。

如何确保基类只生成一个实例
要确保基类只生成一个实例,可以在构造函数内部检查是否已经存在实例。如果存在,则直接返回该实例;否则,创建新实例并保存。这种模式通常被称为“静态实例”模式。例如,使用 getInstance() 静态方法来获取实例,而不是通过 new 关键字直接调用构造函数。

class SingletonBase {
static instance = null;
constructor() {
if (SingletonBase.instance) {
return SingletonBase.instance;
}
this.data = 'Initial Data';
SingletonBase.instance = this;
}
static getInstance() {
if (!SingletonBase.instance) {
SingletonBase.instance = new SingletonBase();
}
return SingletonBase.instance;
}
}
上述代码中,SingletonBase 的构造函数会检查 instance 是否已存在。如果存在,则返回现有实例;否则,创建新实例并赋值给 instance。getInstance() 方法用于获取唯一实例。这样,无论多少次调用 new SingletonBase() 或 SingletonBase.getInstance(),都只会得到一个实例。
如何让子类继承单例基类的功能
子类可以通过 extends 关键字继承单例基类,从而复用其单例逻辑。子类可以添加自己的属性和方法,同时保持单例特性。例如,定义一个 ChildClass 继承自 SingletonBase,并在其中扩展功能。

class ChildClass extends SingletonBase {
constructor() {
super();
this.extraData = 'Extra Data';
}
getCombinedData() {
return `${this.data} - ${this.extraData}`;
}
}
// 获取子类的单例实例
const childInstance = ChildClass.getInstance();
console.log(childInstance.getCombinedData()); // Output: Initial Data - Extra Data
在上述代码中,ChildClass 继承了 SingletonBase,并通过 super() 调用基类构造函数。由于 SingletonBase 的单例逻辑,ChildClass 也会遵循单例模式。getCombinedData() 方法展示了子类如何扩展基类功能。最终,childInstance 是唯一实例,包含基类和子类的所有数据。
单例基类中的状态如何在子类间共享
单例基类中的状态(如 this.data)在所有子类实例间共享,因为所有子类实例实际上都是同一个对象。这意味着对基类状态的修改会影响所有子类。例如,如果 ChildClass 修改了 this.data,其他子类访问时也会看到更新后的值。
const child1 = ChildClass.getInstance(); const child2 = ChildClass.getInstance(); child1.data = 'Modified Data'; console.log(child2.data); // Output: Modified Data
上述代码验证了单例基类状态的共享性。child1 和 child2 是同一实例,因此对 data 的修改会同步反映在两者上。这种特性适用于需要全局共享状态的场景,但需注意避免意外覆盖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











