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实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 Javascript
页面点击小红心js实现代码
May 26 Javascript
laydate时间日历插件使用方法详解
Nov 14 Javascript
微信小程序渲染性能调优小结
Jul 30 Javascript
Jquery让form表单异步提交代码实现
Nov 14 jQuery
js实现无缝轮播图特效
May 09 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
vue实现可以快进后退的跑马灯组件
Apr 08 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
DC动漫人物排行
2020/03/03 欧美动漫
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
javascript 保存文件到本地实现方法
2012/11/29 Javascript
浅析return false的正确使用
2013/11/04 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
JS实现图片切换效果
2018/11/17 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
分享一个常用的Python模拟登陆类
2015/03/29 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
python3实现字符串操作的实例代码
2019/04/16 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
干部鉴定材料
2014/05/18 职场文书
教师党员个人整改措施
2014/10/27 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js