JavaScript链式调用原理与实现方法详解


Posted in Javascript onMay 16, 2020

本文实例讲述了JavaScript链式调用原理与实现方法。分享给大家供大家参考,具体如下:

1、什么是链式调用?

这个很容易理解,例如

$('text').setStyle('color', 'red').show();

一般的函数调用和链式调用的区别:链式调用完方法后,return this返回当前调用方法的对象。

首先,我们先来看看一般函数的调用方式

(1)先创建一个简单的类

//创建一个bird类
  function Bird(name) {
    this.name=name;
    this.run=function () {
    document.write(name+" "+"start run;");
        }
    this.stopRun=function () {
     document.write(name+" "+"start run;");
        }
    this.sing=function () {
      document.write(name+" "+"start sing;");
    }
    this.stopSing=function () {
      document.write(name+" "+"start stopSing;");
    }
  }

(2)使用方式:一般的调用方式

var bird=new Bird("测试");
  bird.run();
  birdbird.sing();
  bird.stopSing();
  bird.stopRun();
//结果为;测试 start run;测试 start sing;测试 start stopSing;测试 start run;

(3)总结,该种方式有一个弊端就是:多次重复使用一个对象变量

然后,我们再来看看将上述改成链式调用的格式

(1)在创建的简单类中加上return this,如下

//创建一个bird类
  function Bird(name) {
    this.name=name;
    this.run=function () {
      document.write(name+" "+"start run;");
      return this;// return this返回当前调用方法的对象。
    }
    this.stopRun=function () {
      document.write(name+" "+"start run;");
      return this;
    }
    this.sing=function () {
      document.write(name+" "+"start sing;");
      return this;
    }
    this.stopSing=function () {
      document.write(name+" "+"start stopSing;");
      return this;
    }
  }

(2)使用链式调用(连缀的方式)

var bird=new Bird("测试");
  bird.run().sing().stopSing().stopRun();//结果为;测试 start run;测试 start sing;测试 start stopSing;测试 start run;

(3)总结此种方式的调用结果与一般的调用方式产生的结果一样,优点是:链式调用这种风格有助于简化代码的编写工作,让代码更加简洁、易读,同时也避免多次重复使用一个对象变量

2.模仿jquery的链式调用

第一步,定义一个含参数的空对象

(function(){
 //下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象
})()//程序启动的时候 里面的代码直接执行了

第二步,准备方法     在_$上定义一个onrReady方法

(function(){

  //第一步,下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象

  //第二步,准备方法 在_$上定义一个onrReady方法
  _$.onrReady=function (fn) {
    //按要求把对象(_$)注册到window对象上
    //对外开放的接口
    window.$=function () {
      return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
    }
    fn();
  }
  }
})()

第三步,为了类(Function)能扩展函数,我们定义一个它的静态函数

Function.prototype.method=function (name,fn) {//(函数名称,函数本身)
   this.prototype[name]=fn;
   return this;//链式调用关键
};//这个函数的意思:为function对象增加函数,会用链式调用,链式调用有两个参数name,和fn

第四步,扩展类的相应方法 链式的对象增加jquery库提供的操作函数

(function(){
  //下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象
  //第二步,准备方法 在_$上定义一个onrReady方法
  _$.onrReady=function (fn) {
    //按要求把对象(_$)注册到window对象上  
    //对外开放的接口
    window.$=function () {
      return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
    }
    fn();
  }
   //第四步
  //扩展类的相应方法 链式的对象增加jquery库提供的操作函数 
_$.method("AddEvent",function (type,fn) {//_$本身是一个function要继承原型链上的东西。
  fn();
}).method("getEvent",function (fn,e) {
  fn();
})

})()

第五步,使用 ,需要调用_$.onReady方法才可以返回对象使用从function类继承而来的原型上的方法

(function () {
  // (1)下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象
  //(2)准备方法 在_$上定义一个onrReady方法
   // window.$=_$;
  _$.onrReady=function (fn) {
    //按要求把对象(_$)注册到window对象上  在任何地方都可以使用
    //对外开放的接口
    window.$=function () {//window 上先注册一个全局变量 与外界产生关系
      return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
    }
    fn();
  }
  //(4)扩展类的相应方法 链式的对象增加jquery库提供的操作函数
_$.method("AddEvent",function (type,fn) {//_$本身是一个function要继承原型链上的东西。
  fn();
}).method("getEvent",function (fn,e) {
  fn();
});
  //第五步,开始使用 ,需要调用_$.onready方法才可以返回对象使用从function类继承而来的原型上的方法
   _$.onrReady(function () {//$是绑定在Windows上的
    $("").AddEvent("click",function () {
      alert("click")
    })
  })

})()

上述综合的代码为

//第三步,为了类(Function)能扩展函数,我们定义一个它的静态函数
Function.prototype.method=function (name,fn) {//(函数名称,函数本身)
   this.prototype[name]=fn;
   return this;//链式调用关键
};//这个函数的意思:为function对象增加函数,会用链式调用,链式调用有两个参数name,和fn

(function () {
  // 第一步,下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象
  //第二步,准备方法 在_$上定义一个onrReady方法
   // window.$=_$;
  _$.onrReady=function (fn) {
    //按要求把对象(_$)注册到window对象上 
    //对外开放的接口
    window.$=function () {
      return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
    }
    fn();
  }
  //第四步,扩展类的相应方法 链式的对象增加jquery库提供的操作函数
_$.method("AddEvent",function (type,fn) {//_$本身是一个function要继承原型链上的东西,所以可以使用method方法
  fn();
}).method("getEvent",function (fn,e) {
  fn();
});
  //第五步,开始使用,需要调用_$.onready方法才可以返回对象使用从function类继承而来的原型上的方法
   _$.onrReady(function () {//$是绑定在Windows上的
    $("").AddEvent("click",function () {
      alert("click")
    })
  })
})()

 上述是将$绑定到window上的操作,如果我们想将$绑定到一个指定对象上我们可以这通过改变上述的第二步和第五步如下,

/**
 * Created by 与你在巅峰相会 on 2017/10/12.
 */

//第三步,为了类(Function)能扩展函数,我们定义一个它的静态函数
Function.prototype.method=function (name,fn) {//(函数名称,函数本身)
   this.prototype[name]=fn;
   return this;//链式调用关键
};//这个函数的意思:为function对象增加函数,会用链式调用,链式调用有两个参数name,和fn

(function () {
  // 第一步,下划线:表示私有变量的写法
  function _$(els) { };//有参数的空对象
  //第二步,准备方法 在_$上定义一个onrReady方法
  _$.onReady=function (obj,fn) {//obj传进来的对象
    if(obj){
      //按要求把对象(_$)注册到window对象上 
      //对外开放的接口
      obj.$=function () {
        return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
      }
    }else {
      //按要求把对象(_$)注册到window对象上  
      //对外开放的接口
      window.$=function () {
        return new _$(arguments);//传递相应的方法调用参数 返回一可以使用function类原型上的方法的对象($("")=_$(参数))
      }
    }
    fn();
  }
  //第四步,扩展类的相应方法 链式的对象增加jquery库提供的操作函数
_$.method("AddEvent",function (type,fn) {//_$本身是一个function要继承原型链上的东西,可以直接使用method方法
  fn();
}).method("getEvent",function (fn,e) {
  fn();
});
  //第五步,开始使用,需要调用_$.onready方法才可以返回对象使用从function类继承而来的原型上的方法
   var com={};
  _$.onReady(com,function () {//$是绑定在Windows上的
    com.$("").AddEvent("click",function () {
      alert("click")
    })
  })
})()

  自己画一个图简单理解一下上面的过程及思路:

JavaScript链式调用原理与实现方法详解

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
面向对象的编程思想在javascript中的运用上部
Nov 20 Javascript
JS类的封装及实现代码
Dec 02 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
Feb 21 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
Aug 24 Javascript
vue.js高德地图实现热点图代码实例
Apr 18 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
May 21 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 #Javascript
JavaScript接口实现方法实例分析
May 16 #Javascript
JavaScript 类的封装操作示例详解
May 16 #Javascript
jquery+css3实现的经典弹出层效果示例
May 16 #jQuery
js抽奖转盘实现方法分析
May 16 #Javascript
JSONP 的原理、理解 与 实例分析
May 16 #Javascript
JavaScript随机数的组合问题案例分析
May 16 #Javascript
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
php一个找二层目录的小东东
2012/08/02 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
python查找指定具有相同内容文件的方法
2015/06/28 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
python实现三壶谜题的示例详解
2020/11/02 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
骨干教师个人总结
2015/02/11 职场文书
红色故事汇观后感
2015/06/18 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
Python实现Hash算法
2022/03/18 Python
postgresql中如何执行sql文件
2023/05/08 PostgreSQL