Javasript设计模式之链式调用

写过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值,就可以让该类变化一个支持方法链式调用的类。而如果要让取值器方法也支持链式调用,就可以在取值器里使用回调的方式来解决这个问题。

转载于:https://www.cnblogs.com/chenjg/p/8904067.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现图片打乱_2020 回顾 | 25张图片,记录潮州的这一年

一年将近,万物更新这一年,不简单,也不容易让我们把时针拨回到1月通过镜头来回顾潮州这一年来令人难忘、激动和高光的时刻// 1月 //- January - 1月份的潮州充满了年味大家都沉浸在迎接新年的喜悦心情中期盼着新年的到来突如其来的疫情打乱了所…

html5 百度地图api文档,开发指南--百度地图JavaScript API大众版.doc

开发指南--百度地图JavaScriptAPI大众版开发指南--百度地图JavaScriptAPI大众版简介 JavaScript API大众版JavaScript API功能介绍百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富、交互性强的地图应用&#xff…

如何导出SQL Azure脚本?

1). Tasks—Generate Scripts 2). In the “Generate and Publish Scripts” dialog, Next -- Next 3).Click “Advanced”, set likes following: 转载于:https://www.cnblogs.com/RobotTech/archive/2012/03/28/2420707.html

迭代器以及迭代器的作用

#迭代器迭代是访问集合元素的一种方式,迭代器是一个能够记住遍历位置的对象 迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束 如果想访问一个元素,需要把这个元素前面的所有元素都遍历后,才可以访问#1.可迭代的对象,像(1),(2)这些对象称之为可迭代对象(Ite…

jh锂电保护电路_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计

锂电池特性首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池?锂电池,工程师对它都不会感到陌生。在电子产品项目开发的过程中,尤其是遇到电池供电的类别项目,工程师就会和锂电池打交道。这是因为锂电…

ImageView相关

ImageViewActivity.java package src.com; import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView; public class ImageViewActivity extends Activity { /* 声明 Button、ImageView对…

html怎么设置闪烁字,HTML最简单的文字闪烁代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Titlekeyframes blink{0%{opacity: 1;}50%{opacity: 1;}50.01%{opacity: 0;}100%{opacity: 0;}}-webkit-keyframes blink {0% { opacity: 1; }50% { opacity: 1; }50.01% { opacity: 0; }100% { opacity: 0; }}-moz-keyframes blin…

as上的git到码云操作_如何使用git从码云克隆项目到本地?

https://www.cnblogs.com/gbb123/p/6784822.html前段时间,有读者微信问我,如果使用Git从码云或者Github 克隆代码到本地,然后进行提交代码的操作 。可能是新手,刚接触编程,我就从网上找到了这篇文章给他看,…

48、多用块枚举,少用for循环

本文概要: 1、首先列举了四种可用于遍历的方式:标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。 2、对每一种遍历都给出对于NSArray、NSDictionary、NSSet三种容器的代码举例,读者可…

linux显示中文乱码

经常使用linux终端,有人上传中文命名的文件显示出中文乱码,下面是解决方法。 默认显示的字符编码# echo $LANGen_US.UTF-8修改i18n文件# vi /etc/sysconfig/i18nLANG"zh_CN.GB18030"LANGUAGE"zh_CN.GB18030:zh_CN.GB2312:zh_CN"SUPP…

ruijie交换机lacp动态_Server2016和华为s5720交换机链路聚合增加带宽

一、 背景1、server端企业中一台server2016利用两块1G网卡组成teaming生成一张2G的虚拟网卡,业务数据在这张带宽为2G的虚拟网卡上运行。这块网卡不仅带宽可以提升1倍,而且可以实现冗余,负载均衡,故障自动切换,保证业务…

如何用Netty实现一个轻量级的HTTP代理服务器

为什么会想通过Netty构建一个HTTP代理服务器?这也是笔者发表这篇文章的目的所在。 其主要还是源于解决在日常开发测试过程中,一直困扰测试同学很久的一个问题,现在我就来具体阐述一下这个问题。 在日常开发测试过程中,为了确保上线…

微型计算机系统包括( )几部分,微型计算机系统包括哪几个部分?

完整的计算机系统包括两大部分,即硬件系统和软件系统。所谓硬件,是指构成计算机的物理设备,即由机械、电子器件构成的具有输入、存储、计算、控制和输出功能的实体部件。下面介绍一下电脑主机的各个部件:(1)电源:电源是…

hello my first blog

2019独角兽企业重金招聘Python工程师标准>>> <?phpfunction hello {echo hello world;} 转载于:https://my.oschina.net/guanyue/blog/52043

python 钉钉机器人发送图片_Python结合钉钉实时自动监控股票行情,上班炒股再也不怕老板发现...

最近全球股市开始回暖&#xff0c;之前清仓的股民现在又陆续开始建仓。股市交易时间&#xff0c;一般也是上班时间&#xff0c;频繁的查看股票软件不仅会影响工作效率&#xff0c;也容易被老板以为工作不饱和。所以&#xff0c;我们就借助python的强大功能&#xff0c;把提前设…

Ubuntu远程操作Linux服务器GUI程序

此文针对在Server端执行gui程序失败的情况 OS&#xff1a;Ubuntu 12.04&#xff08;以下操作应该在其他版本的Ubuntu上也适用&#xff09; 首先&#xff0c;检查你的Xserver&#xff0c;看是否有一个“-nolisten”选项。在终端执行“ps -ef | grep nolisten",查看返回内容…

IDEA MAVEN Project 显示问题

今天正常打开idea&#xff0c;却发现maven窗口找不到了&#xff1a;试了这些方法 首先idea自带了maven控件&#xff0c;不像Eclipse还需要下载控件&#xff0c;如果你以前有maven在右边&#xff0c;出于某种原因&#xff0c;消失找不到 了&#xff0c;你可以试试我写的方法。 …

2 什么是计算机网络设置密码,计算机网络技术及应用(第2版)第6章网络操作系统基本配置.ppt...

计算机网络技术及应用1&#xff0e;访问组策略控制台模板 (1)当前计算机的控制台 Windows server 2008系统默认安装了组策略程序&#xff0c;在“开始”菜单中单击“运行”项&#xff0c;输入gpedit.msc并确定&#xff0c;即可运行程序。 (2)打开其他计算机的控制台 配置其他的…

画图调子图间距_好看好用的桥梁工程图,你值得拥有!

来源&#xff1a;筑龙路桥设计桥梁工程图的内容1.桥位地形、地物、地质及水文资料图&#xff0c;用来表示桥梁位置及周边关系的图纸。桥位平面图、桥位地质断面图。2.桥梁总体布置图&#xff0c;表示桥梁整体形状、大小、结构的图纸。立面图、侧立面图。3.桥梁的上部、下部构造…

MySQL 调用存储过程

1&#xff1a;存储过程返回值 View Code public void InputOutputParameters() { AdoHelper ado AdoHelper.CreateHelper(DbProvideType.MySql); ado.ExecuteNonQuery(conn, CommandType.Text, "CREATE PROCEDURE spTest1( INOUT strVal V…