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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)通过引入量子重加密技术…