JavaScript:鏈式調用

概念

鏈式調用(Method Chaining)是 JavaScript 中一種常見的編程模式,允許通過連續調用對象的方法來簡化代碼。這種模式的核心在于每個方法返回調用對象本身(通常是 this),從而可以繼續調用其他方法。

鏈式調用的關鍵在于每個方法返回當前對象(this)。這樣,每次方法調用后,可以立即調用下一個方法。例如:

const obj = {method1() {// 執行邏輯return this;},method2() {// 執行邏輯return this;}
};obj.method1().method2();

優點

  1. 代碼簡潔:減少重復代碼,避免多次引用同一對象。
  2. 可讀性高:鏈式調用的代碼通常更接近自然語言,易于理解。
  3. 流暢接口:適合構建流暢的 API 或 DSL(領域特定語言)。

常見應用場景

  1. jQuery:jQuery 是鏈式調用的經典例子,例如:

    $('div').addClass('active').css('color', 'red').fadeOut();
    
  2. 數組操作:部分數組方法(如 mapfilter)可以鏈式調用:

    const result = [1, 2, 3].map(x => x * 2).filter(x => x > 3);
    
  3. 構建器模式:用于構造復雜對象,例如:

    const query = new QueryBuilder().select('name').from('users').where('age > 18').limit(10);
    

實現自定義鏈式調用

下面是一個簡單的自定義鏈式調用的例子:

class Calculator {constructor(value = 0) {this.value = value;}add(num) {this.value += num;return this;}subtract(num) {this.value -= num;return this;}multiply(num) {this.value *= num;return this;}getResult() {return this.value;}
}const calc = new Calculator(10);
const result = calc.add(5).subtract(3).multiply(2).getResult(); // 24

注意事項

  1. 不可變對象:如果需要保持對象不可變,鏈式調用可能不適用,因為每次方法調用都會返回新對象。
  2. 調試困難:過長的鏈式調用可能增加調試難度,建議適度拆分。
  3. 錯誤處理:鏈式調用中某個方法出錯時,可能需要額外的錯誤處理機制。

鏈式調用是一種強大的模式,但需根據具體場景合理使用。


面試題(wxg)

var data = [{ price: 13, name: 'A-apple' },{ price: 9, name: 'B-apple' },{ price: 16, name: 'A-orange' },{ price: 10, name: 'B-orange' },{ price: 20, name: null }
];var find = function (origin) {// your code are here...
};// 查找 data 中,符合條件的數據,并進行排序
var result = find(data).where({ 'name': /^A/ }).orderBy('price', 'desc');
console.log(result);
// 預期輸出: [ { price: 16, name: 'A-orange' }, { price: 13, name: 'A-apple' } ]

分析:where 函數中傳遞的參數表示條件,keydata 中的屬性,value 是比較的規則(正則表達式);orderBy 傳遞兩個參數,第一個表示比較哪個屬性,第二個是排序規則(正序或倒序)

// 原始數據
var data = [{ price: 13, name: 'A-apple' },{ price: 9, name: 'B-apple' },{ price: 16, name: 'A-orange' },{ price: 10, name: 'B-orange' },{ price: 20, name: null }
];// 實現find函數
var find = function (origin) {// 創建一個查詢對象var query = {data: origin,// where方法用于過濾數據where: function(conditions) {this.data = this.data.filter(function(item) {// 遍歷條件對象,篩選出符合所有條件的記錄for (var key in conditions) {var condition = conditions[key];// 如果條件值是正則表達式if (condition instanceof RegExp) {if (!condition.test(item[key])) {return false;}} // 如果條件值是普通值else {if (item[key] !== condition) {return false;}}}return true;});return this; // 返回this以支持鏈式調用},// orderBy方法用于排序orderBy: function(field, direction) {this.data.sort(function(a, b) {var aVal = a[field];var bVal = b[field];// 處理null值if (aVal === null) aVal = 0;if (bVal === null) bVal = 0;if (direction === 'desc') {return bVal - aVal; // 降序} else {return aVal - bVal; // 升序}});return this.data; // 返回排序后的數組}};return query;
};// 查找 data 中,符合條件的數據,并進行排序
var result = find(data).where({ 'name': /^A/ }).orderBy('price', 'desc');
console.log(result);// 預期輸出: [ { price: 16, name: 'A-orange' }, { price: 13, name: 'A-apple' } ]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94480.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

龍芯(loongson) ls2k1000 openwrt

PC環境:Linux Mint 21.3安裝依賴sudo apt install build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget下載源碼:git clone https://gitee.co…

算法438. 找到字符串中所有字母異位詞

給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。示例 1:輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba", 它是 "abc&…

Go語言中的閉包詳解

閉包在Go語言中是一個能夠訪問并操作其外部作用域變量的函數,即使外部函數已經執行完畢。閉包由函數體和其引用的環境(外部變量)組成,及:閉包 函數 環境。閉包的特性:捕獲外部變量:內部函數可…

【DL學習筆記】Dataset類功能以及自定義

文章目錄一、Dataset 與 DataLoader 功能介紹抽象類Dataset的作用DataLoader 作用兩者關系二、自定義Dataset類Dataset的三個重要方法__len__()方法_getitem__()方法__init__ 方法三、現成的torchvision.datasets模塊MNIST舉例COCODetection舉例torchvision.datasets.MNIST使用…

Python爬蟲實戰:研究python_reference庫,構建技術研究數據系統

1. 引言 1.1 研究背景與意義 在大數據時代,數據已成為重要的生產要素。互聯網作為全球最大的信息庫,蘊含著海量有價值的數據。如何從紛繁復雜的網絡信息中快速、準確地提取所需數據,成為各行各業面臨的重要課題。網絡爬蟲技術作為數據獲取的關鍵手段,能夠模擬人類瀏覽網頁…

Web開發系列-第15章 項目部署-Docker

第15章 項目部署-Docker Docker技術能夠避免部署對服務器環境的依賴,減少復雜的部署流程。 輕松部署各種常見軟件、Java項目 參考文檔:???????????????????第十五章:…

微軟無界鼠標(Mouse without Borders)安裝及使用:多臺電腦共用鼠標鍵盤

文章目錄一、寫在前面二、下載安裝1、兩臺電腦都下載安裝2、被控端3、控制端主機三、使用一、寫在前面 在辦公中,我們經常會遇到這種場景,自己帶著筆記本電腦外加公司配置的臺式機。由于兩臺電腦,所以就需要搭配兩套鍵盤鼠標。對于有限的辦公…

nodejs 編程基礎01-NPM包管理

1:npm 包管理介紹 npm 是nodejs 的包管理工具,類似于java 的maven 和 gradle 等,用來解決nodejs 的依賴包問題 使用場景:1. 從NPM 服務騎上下載或拉去別人編寫好的第三方包到本地進行使用2. 將自己編寫代碼或軟件包發布到npm 服務器供他人使用…

基于Mediapipe_Unity_Plugin實現手勢識別

GitHub - homuler/MediaPipeUnityPlugin: Unity plugin to run MediaPipehttps://github.com/homuler/MediaPipeUnityPlugin 實現了以下: public enum HandGesture { None, Stop, ThumbsUp, Victory, OK, OpenHand } 核心腳本&#xff1a…

Android 項目構建編譯概述

主要內容是Android AOSP源碼的管理方式,項目源碼的構建和編譯,用到比如git、repo、gerrit一些命令工具,以及使用Soong編譯系統,編寫Android.bp文件的格式樣式。 1. Android操作系統堆棧概述 Android 是一個針對多種不同設備類型打…

Python爬蟲08_Requests聚焦批量爬取圖片

一、Requests聚焦批量爬取圖片 import re import requests import os import timeurl https://www.douban.com/ userAgent {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0}#獲取整個瀏覽頁面 page_text requests.get(urlur…

Spring Cloud系列—簡介

目錄 1 單體架構 2 集群與分布式 3 微服務架構 4 Spring Cloud 5 Spring Cloud環境和工程搭建 5.1 服務拆分 5.2 示例 5.2.1 數據庫配置 5.2.2 父子項目創建 5.2.3 order_service子項目結構配置 5.2.4 product_service子項目結構配置 5.2.5 服務之間的遠程調用 5.…

【普中STM32精靈開發攻略】--第 1 章 如何使用本攻略

學習本開發攻略主要參考的文檔有《STM32F1xx 中文參考手冊》和《Cortex M3權威指南(中文)》,這兩本都是 ST 官方手冊,尤其是《STM32F1xx 中文參考手冊》,里面包含了 STM32F1 內部所有外設介紹,非常詳細。大家在學習 STM32F103的時…

【Docker】RK3576-Debian上使用Docker安裝Ubuntu22.04+ROS2

1、簡述 RK3576自帶Debian12系統,如果要使用ROS2,可以在Debian上直接安裝ROS2,缺點是有的ROS包需要源碼編譯;當然最好是使用Ubuntu系統,可以使用Docker安裝,或者構建Ubuntu系統,替換Debian系統。 推薦使用Docker來安裝Ubuntu22.04,這里會有個疑問,是否可以直接使用Do…

解決docker load加載tar鏡像報json no such file or directory的錯誤

在使用docker加載離線鏡像文件時,出現了json no such file or directory的錯誤,剛開始以為是壓縮包拷貝壞了,重新拷貝了以后還是出現了問題。經過網上查找方案,并且自己實踐,采用下面的簡單方法就可以搞定。 歸結為一句…

《協作畫布的深層架構:React與TypeScript構建多人實時繪圖應用的核心邏輯》

多人在線協作繪圖應用的構建不僅是技術棧的簡單組合,更是對實時性、一致性與用戶體驗的多維挑戰。基于React與TypeScript開發這類應用,需要在圖形繪制的基礎功能之外,解決多用戶并發操作的同步難題、狀態回溯的邏輯沖突以及大規模協作的性能瓶頸。每一層架構的設計,都需兼顧…

智慧社區(八)——社區人臉識別出入管理系統設計與實現

在社區安全管理日益智能化的背景下,傳統的人工登記方式已難以滿足高效、精準的管理需求。本文將詳細介紹一套基于人臉識別技術的社區出入管理系統,該系統通過整合騰訊云 AI 接口、數據庫設計與業務邏輯,實現了居民出入自動識別、記錄追蹤與訪…

嵌入式開發學習———Linux環境下IO進程線程學習(四)

進程相關函數fork創建一個子進程,子進程復制父進程的地址空間。父進程返回子進程PID,子進程返回0。pid_t pid fork(); if (pid 0) { /* 子進程代碼 */ } else { /* 父進程代碼 */ }getpid獲取當前進程的PID。pid_t pid getpid();getppid獲取父進程的P…

標記-清除算法中的可達性判定與Chrome DevTools內存分析實踐

引言 在現代前端開發中,內存管理是保證應用性能與用戶體驗的核心技術之一。作為JavaScript運行時的基礎機制,標記-清除算法(Mark-and-Sweep) 通過可達性判定決定哪些內存需要回收,而Chrome DevTools提供的Memory工具則為開發者提供了深度的內…

微算法科技(NASDAQ:MLGO)基于量子重加密技術構建區塊鏈數據共享解決方案

隨著信息技術的飛速發展,數據已成為數字經濟時代的核心生產要素。數據的共享和安全往往是一對難以調和的矛盾。傳統的加密方法在面對日益強大的計算能力和復雜的網絡攻擊時,安全性受到了挑戰。微算法科技(NASDAQ:MLGO)通過引入量子重加密技術…