javascript單例模式及開發實踐

来源:https://www.cnblogs.com/searworld/archive/2018/04/06/8729128.html
-Advertisement-
Play Games

定義: 保證一個對象(類)僅有一個實例,並提供一個訪問它的全局訪問點; 實現原理: 利用閉包來保持對一個局部變數的引用,這個變數保存著首次創建的唯一的實例; 主要用於: 全局緩存、登錄浮窗等只需要唯一一個實例的時候; Part1、命名空間的管理員開發中經常會遇到不同的人定義的變數使用的單詞可能會重覆 ...


定義:

保證一個對象(類)僅有一個實例,並提供一個訪問它的全局訪問點;

實現原理:

利用閉包來保持對一個局部變數的引用,這個變數保存著首次創建的唯一的實例;

主要用於:

全局緩存、登錄浮窗等只需要唯一一個實例的時候;

Part1、命名空間的管理員
開發中經常會遇到不同的人定義的變數使用的單詞可能會重覆,此時就需要用到命名空間來約束每個人定義的變數來解決這類問題。比如小明的代碼,他可以定義一個xiaoZhang的空間。同樣,我們平時使用的vue定義use()方法我們可以通過vue.use()來訪問

假如小張想實現這樣一個效果,點擊按鈕正方形的背景變成紅色

<style>
   .squareStyle {
    width: 100px;
    height: 100px;
    background-color: yellow;
}
</style>
<body>
<button id="btn">變黃</button>
<div id="square" class="squareStyle"></div>
</body>
<script>
var Zhang = {
    a: function (id) {
        return document.getElementById(id)
    }, //獲取正方形
    b: function (id, key, value) {
        this.a(id).style[key] = value
    } //這裡為什麼用this?a,b方法都在單例對象Zhang 中,而當前對象中的this指代當前對象,所以我們還可以在b方法中通過this.a()來使用Zhang單例對象中的a方法
} //創建空間
document.getElementById('btn').onclick = function () {
    Zhang.b('square', 'backgroundColor', 'red')
}
</script>

this在javascript中的運用詳細可以看https://www.jianshu.com/p/041c683f6031這篇文章

Part2、惰性單例
需要的時候才被創建對象實例,就是需要的時候才動態調用,而不是頁面載入好的時候就創建

方式一:頁面載入好的時候調用,只不過是隱藏狀態
    var createLoginAlert = (function () {
      console.log('創建了')
       var div = document.createElement('div')
      div.innerHTML = '我是彈窗'
      div.style.display = 'none'
      document.body.appendChild(div)
       return div
})()  //自執函數

document.getElementById('btn').onclick = function () {
    createLoginAlert.style.display = 'block'   //點擊的時候顯示
}

現在有個問題,就是用戶可能只是瀏覽頁面,並不需要彈窗內容,接下來方式二是對方式一的優化

方式二:點擊的時候才創建實例
<button id="btn">提交</button>

 var createLoginAlert = function () {
    var div = document.createElement('div')
    div.innerHTML = '我是彈窗'
    div.style.display = 'none'
    document.body.appendChild(div)
    return div
}   
//    點擊提交時候創建實例
document.getElementById('btn').onclick = function () {
    var popUp = createLoginAlert()
    popUp.style.display = 'block'
}

每一次點擊的時候重新創建實例,雖然我們可以在點擊浮窗上的關閉按鈕時(此處未實現)把這個浮 窗從頁面中刪除掉,但這樣頻繁地創建和刪除節點明顯是不合理的,也是不必要的

方式三:用一個變數來判斷是否已經創建過登錄浮窗,沒有-->創建,有-->復用
 var createLoginAlert = (function () {
        var div;  //變數
        return function () {
            if (!div) {
                console.log('沒有DIV')
                div = document.createElement('div')
                div.innerHTML = '我是彈窗'
                div.style.display = 'none'
                document.body.appendChild(div); 
                return div
            }
            return div
        }
    })()

//    點擊提交時候創建實例
document.getElementById('btn').onclick = function () {
    var popUp = createLoginAlert()
    popUp.style.display = 'block'
}

Part 3 對象池

對象池維護一個裝載著空閑對象的池子,如果需要對象的時候,不是直接new,而是從對象池中取出,如果對象池中沒有空閑對象,則新建一個空閑對象。對象池技術的使用非常廣泛,http連接池和資料庫連接池都是其代表。在web前端中,對象池使用最多的使得DOM有關的操作。

對象池的實現

var objectPoolFactory=function(createObjFn){
var pool=[],
    create=function(){
        var obj=pool.length>0?pool.shift():createObjFn.apply(this,arguments);            
        return obj;
    },
    recover=function(obj){
        pool.push(obj);
    };
return {
    create:create,
    recover:recover,
};

};

Part 4、 變數緩存

如果ret不是基本變數,而是一個對象,則可以用來實現緩存,在jQuery的源代碼中有很多這樣的例子。

var cache={};//一般定義為一個全局變數
var tmp=cache[key]||fn(key);

查閱文獻:
《javascript設計模式》《javascript設計模式及開發實踐》
分享文檔:
鏈接: https://pan.baidu.com/s/1Twpu1hM2YaPsNEqgiXsAZQ 密碼: i8jf
僅限知識分享,請勿商業使用,謝謝


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • --1.查詢emp表,顯示薪水大於2000,且工作類別是MANAGER的雇員信息 select * from emp where sal > 2000and job = 'MANAGER'; --2.查詢emp表,顯示年薪大於30000,工作類別不是MANAGER的雇員信息 select * fro ...
  • 這裡使用了迴圈刪除,並不是最優的方法,歡迎園友不吝批評指正。 ...
  • 在SQL Server的資料庫維護過程中,有時候在一些特殊情況下需要在單用戶模式下啟動SQL Server實例。 下麵總結一下單用戶模式啟動SQL Server的幾種方式: 1:命令模式(sqlservr.exe)啟動 首先在命令視窗中切換到Binn目錄(這個要視SQL Server實際安裝路徑情況... ...
  • 移動設備抓包主要方式 一、PC上設置網路共用,生成Wi Fi熱點供移動設備使用,PC上再使用tcpdump、Wireshark等捕獲分析; 二、PC上開啟http代理工具伺服器(如Charles、fiddler),移動設備再通過該HTTP代理上網(只能抓去HTTP/HTTPs); 三、使用管道工具將 ...
  • 開題:之前就有所耳聞,最近兩天第一次運用到圖標字體。剛開始嘛,一臉懵逼的狀態。成功運用之後就來記錄一下使用過程咯! 1. 打開線上生成工具:https://icomoon.io/app/#/select 2. 導入本地文件或者選擇圖標庫 (1) 如果你本地沒有.svg圖標,你可以選擇線上免費的圖標。 ...
  • Nodejs設計的核心理念:1.事件迴圈;2.模式;3.差錯處理;4.運用多處理器 ...
  • 時間關係長話短說,今天把文章編輯和刪除功能實現了。 本來是要單獨做兩個按鈕來選擇列表中的所有朋友圈文章,但是老師想偷懶……所以我也就跟著偷懶了。 編輯文章部分,可以獲取每條朋友圈的標題和內容。 第一步編輯的時候要打開編輯框,改動之後再保存至資料庫。 測試刪除這條數據。 有一個刪除的提示,也是用的el ...
  • 1)基礎 學習目的: 1. 客戶端表單驗證 2. 頁面動態效果 3. jQuery的基礎 什麼是JavaScript? 一種描述性語言,也是一種基於對象和事件驅動的,並具有安全性能的腳本語言 javaScript是一種基於對象和事件驅動的,並具有安全性能的腳本語言 解釋執行javaScript特點向 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...