Javasript設計模式之鏈式調用

来源:https://www.cnblogs.com/chenjg/archive/2018/04/21/8904067.html
-Advertisement-
Play Games

寫過jquery的可能都知道,jquery裡面可以很方便的使用以下代碼: 而jquery這種調用方式就是鏈式調用。我們可以從上述代碼看出來,如果不使用鏈式調用的話,那麼我們會增加很多重覆的代碼,而且特別冗餘。而通過鏈式調用,我們可以節省很多代碼,並且代碼看起來更加優雅和整潔。那麼,接下來,我們來 ...


寫過jquery的可能都知道,jquery裡面可以很方便的使用以下代碼:

// 不使用鏈式調用
const element = $(ele);
element.addClass('red');
element.removeClass('green');
element.show();

// 鏈式調用
$(ele)
  .addClass('red')
  .removeClass('green')
  .show();

而jquery這種調用方式就是鏈式調用。我們可以從上述代碼看出來,如果不使用鏈式調用的話,那麼我們會增加很多重覆的代碼,而且特別冗餘。而通過鏈式調用,我們可以節省很多代碼,並且代碼看起來更加優雅和整潔。那麼,接下來,我們來討論下如何實現一個支持鏈式調用的庫。

瞭解過原型鏈的人都知道,由構造函數生成的實例都可以訪問其原型對象的屬性和方法,因此,我們讓定義在原型對象的方法最後都返回this(調用該方法的實例),就可以對原型方法進行鏈式調用。

// 通過立即執行函數,聲明瞭一個_$函數,並且將一個$函數掛載到window上,並且每次調用$()的時候,返回的其實是個_$實例,由於原型對象方法里,執行最後都會返回一個this,因此就可以執行鏈式調用。
(function () {
  // 構造函數
  function _$(selector) {
    // ...
  }

  _$.prototype = {
    addClass: function (className) {
      // ...
      return this;
    },
    removeClass: function (className) {
      // ...
      return this;
    },
    show: function () {
      // ...
      return this;
    }
  };

  _$.prototype.constructor = _$;

  // 每次調用$()的時候,返回的其實是個_$實例
  window.$ = function () {
    return new _$(arguments);
  }
})();

// 通過這種方式,我們就可以直接使用$的鏈式調用
$(ele)
  .addClass('red')
  .removeClass('green')
  .show();

當然,上述代碼其實可以進行優化一下,因為假設你引入的庫里,已經有人定義了$函數,那麼就會面臨著命名衝突的問題。所以,我們可以為其增加一個安裝器

(function () {
  // 構造函數
  function _$(selector) {
    // ...
  }

  _$.prototype = {
    addClass: function (className) {
      // ...
      return this;
    },
    removeClass: function (className) {
      // ...
      return this;
    },
    show: function () {
      // ...
      return this;
    }
  };

  _$.prototype.constructor = _$;

  // 增加一個安裝器
  window.installHelper = function (scope, interface) {
    scope[interface] = function () {
      return new _$(arguments);
    }
  }
})();

// 而用戶就可以這樣使用它來自定義掛載對象以及其命名
installHelper(window, '$');

$(ele).show();

當然,有時候鏈式調用並不是一個好的主意。鏈式調用適用於賦值器方法,但是對於取值器方法的話,就不是很友好。因為我們有時候是想要方法返回一些數據,而不是返回一個this。對於這種情況的話,主要有兩種解決方法,一種是對於取值器方法就不返回this,直接返回數據。而另一種方法呢,則是通過回調方法來處理數據:

// 第一種方法,當遇到取值器,則直接返回數據
(function () {
  // 構造函數
  function _$(selector) {
    this.ele = document.querySelector(selector);
    // ...
  }

  _$.prototype = {
    addClass: function (className) {
      // ...
      return this;
    },
    // 取值器
    getClass: function () {
      // ...
      return this.ele.className;
    }
  };

  _$.prototype.constructor = _$;
})();

// 第二種方式,通過回調的方式來處理數據
(function () {
  // 構造函數
  function _$(selector) {
    this.ele = document.querySelector(selector);
    // ...
  }

  _$.prototype = {
    addClass: function (className) {
      // ...
      return this;
    },
    getClass: function (cb) {
      // ...
      cb.call(this, this.ele.className);
      return this;
    }
  };

  _$.prototype.constructor = _$;
})();

通過鏈式調用,我們可以簡化我們的代碼,讓代碼更加簡潔易讀。而我們只需要讓類所有的方法都返回this值,就可以讓該類變化一個支持方法鏈式調用的類。而如果要讓取值器方法也支持鏈式調用,就可以在取值器里使用回調的方式來解決這個問題。


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

-Advertisement-
Play Games
更多相關文章
  • 運用摺疊面板後 可以讓頁面更加整潔 有什麼不懂的可以留言 代碼放到底部 需要引入的文件 JQuery代碼: html代碼 <div class="layui-colla-item"> <div class="layui-colla-title" style="background-color: #e ...
  • 以往 HTML 的 input 輸入框,無法即時(實時)反映使用者(用戶)的輸入內容。現在 HTML5 新增的 input 事件,可達成此一需求。 ...
  • input輸入框<div id="top-title" style="position: relative"> <img class="img-responsive center-block" alt="" src="" style="float:left;z-index: 999;position ...
  • 上周的某一天,和一位同樣是前端技術極度愛好的開發者朋友聊天,他在提出了一個問題,他寫的vue程式為什麼在dev模式運行良好,而在production模式就直接報錯了。這讓我感到驚訝,還有這麼神奇的事情。今就把這個歷險記道給大伙聽聽,看能從中學習到什麼? 一、還原現場 朋友在看到我的驚訝後,分分就把他 ...
  • 小程式項目別的頁面初始化拿到的值為兩種狀態,其他頁面拿不到app.js全局globalData下全局的cookie ...
  • 1.首先寫一個遮罩層div,然後再寫一個彈窗的div js代碼:(把jq引進來) 效果: ...
  • CH1 認識HTML HTML和CSS是我們用來創建網頁的語言:HTML是超文本標記語言(HyperText Markup Language)的縮寫,用來建立網頁的結構;CSS是層疊樣式表(Cascading Style Sheet)的縮寫,用來控制HTML的表現。 Web伺服器存儲並提供由HTML ...
  • ​ 前面在看題目的時候 偶然看到 使用parseInt 來進行整數判斷 但是這裡的parseInt是錯誤示範 之後瞭解了一下 發現這和函數 很有研究 先看看 w3c怎麼說這個的 說實話 雖然我沒有比較好的描述,但是覺的他的解釋並不好 看不懂 我們來看看當沒有 radix這個參數的時候 parseIn ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...