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 ajax 登录验证实现代码
Sep 23 Javascript
Function.prototype.call.apply结合用法分析示例
Jul 03 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
javascript无刷新评论实现方法
May 13 Javascript
JavaScript实现Flash炫光波动特效
May 14 Javascript
通过正则表达式获取url中参数的简单实现
Jun 07 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
原生JS实现ajax与ajax的跨域请求实例
Dec 01 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
May 07 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
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
有趣的python小程序分享
2017/12/05 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python实现统计代码行数的小工具
2019/09/19 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Python利用命名空间解析XML文档
2020/08/10 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
《雨点》教学反思
2014/02/12 职场文书
安全生产目标责任书
2014/04/14 职场文书
婚礼秀策划方案
2014/05/19 职场文书
创建文明城市标语
2014/06/16 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
上课迟到检讨书
2015/05/06 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
个人合作协议范本
2015/08/06 职场文书
2016寒假假期总结
2015/10/10 职场文书
Mysql Show Profile
2021/04/05 MySQL
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis