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 相关文章推荐
js身份证验证超强脚本
Oct 26 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
Bootstrap媒体对象的实现
May 01 Javascript
JS实现关闭当前页而不弹出提示框的方法
Jun 22 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
vue开发拖拽进度条滑动组件
Sep 21 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
小程序实现侧滑删除功能
Jun 25 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
js实现交通灯效果
2017/01/13 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
express启用https使用小记
2019/05/21 Javascript
Python解析xml中dom元素的方法
2015/03/12 Python
Python的Django框架安装全攻略
2015/07/15 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
英国二手物品交易网站:Preloved
2017/10/06 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
医学生个人求职信范文
2013/09/24 职场文书
保送生自荐信范文
2013/10/06 职场文书
车间班组长的职责
2013/12/13 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
招聘专员岗位职责
2014/03/07 职场文书
团委竞选演讲稿
2014/04/24 职场文书
红头文件任命书范本
2014/06/05 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
高二英语教学反思
2016/03/03 职场文书
AngularJS实现多级下拉框
2022/03/25 Javascript