Javasript设计模式之链式调用详解


Posted in Javascript onApril 26, 2018

本文实例为大家分享了js设计模式之链式调用的具体代码,供大家参考,具体内容如下

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 获取用户客户端操作系统版本
Aug 25 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
Jun 10 Javascript
jQuery中eq()方法用法实例
Jan 05 Javascript
javascript实现回到顶部特效
May 06 Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
Aug 16 Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
在vue-cli搭建的项目中增加后台mock接口的方法
Apr 26 #Javascript
vue 做移动端微信公众号采坑经验记录
Apr 26 #Javascript
jQuery length 和 size()区别总结
Apr 26 #jQuery
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 #Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
Apr 26 #Javascript
vue如何判断dom的class
Apr 26 #Javascript
vue 中filter的多种用法
Apr 26 #Javascript
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
用python解压分析jar包实例
2020/01/16 Python
python利用platform模块获取系统信息
2020/10/09 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
幼儿园大班新学期寄语
2014/01/18 职场文书
中学自我评价
2014/01/31 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers