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 imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
ExtJs GridPanel简单的增删改实现代码
Aug 26 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
Jul 31 Javascript
require.js的用法详解
Oct 20 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
jQuery的事件预绑定
Dec 05 Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 Javascript
详解处理bootstrap4不支持远程静态框问题
Jul 20 Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 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 全局变量范围分析
2009/08/07 PHP
PHP之短标签开启设置
2013/06/17 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
javascript this详细介绍
2016/09/19 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
js实现导航跟随效果
2018/11/17 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
vue-property-decorator用法详解
2019/12/12 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python自定义线程类简单示例
2018/03/23 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python3获取url文件大小示例代码
2019/09/18 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
数控技校生自我鉴定
2014/04/19 职场文书
好人好事演讲稿
2014/09/01 职场文书
工作证明英文模板
2014/10/21 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
初中政治教学反思
2016/02/23 职场文书
Python开发五子棋小游戏
2022/05/02 Python