在 JavaScript 中實現單體類

Shraddha Paghdar 2023年10月12日
  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