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 相关文章推荐
简单的jquery拖拽排序效果实现代码
Sep 20 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
浅谈JavaScript之事件绑定
Jul 08 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
AngularJS入门教程之过滤器详解
Aug 19 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
vue element-ui之怎么封装一个自己的组件的详解
May 20 Javascript
JS实现给数组对象排序的方法分析
Jun 24 Javascript
mapboxgl实现带箭头轨迹线的代码
Jan 04 Javascript
在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
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
一道python走迷宫算法题
2018/01/22 Python
python 二维数组90度旋转的方法
2019/01/28 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Python如何实现远程方法调用
2020/08/07 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
主题酒店策划书
2014/01/28 职场文书
请假条格式范文
2014/04/10 职场文书
小学安全汇报材料
2014/08/14 职场文书
超级礼物观后感
2015/06/15 职场文书
与死神共舞观后感
2015/06/15 职场文书
结婚典礼主持词
2015/06/29 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android