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 相关文章推荐
淘宝搜索框效果实现分析
Mar 05 Javascript
js Html结构转字符串形式显示代码
Nov 15 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
Dec 30 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
浅谈vue.use()方法从源码到使用
May 12 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 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
如何用php获取文件名后缀
2013/06/09 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
js数组的操作指南
2014/12/28 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
21行Python代码实现拼写检查器
2016/01/25 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
英语自荐信范文
2013/12/11 职场文书
奥巴马演讲稿
2014/01/08 职场文书
促销活动方案模板
2014/02/24 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
党的生日演讲稿
2014/09/10 职场文书
2015年司法所工作总结
2015/04/27 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书