在 JavaScript 中实现单体类

Shraddha Paghdar 2023年1月30日 2022年5月10日
  1. JavaScript 中的单例实现
  2. JavaScript 中单例的优点
在 JavaScript 中实现单体类

在今天的文章中,我们将学习如何使用最简单的方式在 JavaScript 中实现单例类。

JavaScript 中的单例实现

在 Java 等编程语言中,一个对象可以有多个实例。但是当我们只想限制一个对象的单个实例时,就会出现单例模式。

此模式将特定对象的实例数限制为在任何给定时间点只有一个。这个单一实例的名称是一个单例。

当从中央位置协调系统级操作时,此概念很有用。最好的例子之一是数据库连接池。

数据库连接对任何应用程序都很重要,池管理整个应用程序的所有数据库连接的创建、销毁和持续时间,确保没有连接丢失。

让我们举个例子。

const SingletonFunction = (function () {
	let instance;

	function createInstance() {
		return new Object("Instance of SingletonFunction");
	}

	return {
		getInstance: function () {
			if (!instance) {
				instance = createInstance();
			}
			return instance;
		}
	};
})();

function TestSingletonFunction() {
	const instance1 = SingletonFunction.getInstance();
	const instance2 = SingletonFunction.getInstance();
	console.log("Both instances are the same? " + (instance1 === instance2));
}
TestSingletonFunction()

在上面的示例中,getInstance 方法充当 Singleton 看门人。它返回对象的唯一实例,同时维护对它的私有引用,外部世界无法访问。

getInstance 方法说明了另一种称为 Lazy Load 的设计模式。延迟加载检查是否已经创建了实例;否则,它将创建一个并将其存储以供将来参考。

所有后续调用都将收到存档的实例。延迟加载是一种节省内存和 CPU 的技术,它仅在必要时创建对象。

当你创建单例方法的两个实例时,这两个实例在数据类型和值方面是相同的。当你在任何浏览器中运行上述代码时,你会看到两个实例都是同一个实例。

输出:

"Both instances are the same? true"

JavaScript 中单例的优点

全局变量是 JavaScript 的重要组成部分,但单例减少了对全局变量的需求。当只需要一个实例时,其他几个模型,例如 FactoryPrototypeFaçade,通常作为 Singleton 实现。

这个对象被实现为一个即时的、匿名的函数。该函数通过用括号括起来立即执行,然后再加上两个括号。

因为没有名字,所以叫匿名。

Singleton 是常见 JavaScript 模式的一种表现形式:Module.Module 模式是所有主要 JavaScript 库和框架(jQuery、Backbone、Ember 等)的基础。

Shraddha Paghdar avatar Shraddha Paghdar avatar

Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.

LinkedIn