JavaScript中链式调用之研习

 更新时间:2011年04月07日 22:03:56   作者:  
方法链一般适合对一个对象进行连续操作(集中在一句代码)。一定程度上可以减少代码量,缺点是它占用了函数的返回值。

一、对象链:方法体内返回对象实例自身(this)

复制代码 代码如下:

function ClassA(){
this.prop1 = null;
this.prop2 = null;
this.prop3 = null;
}
ClassA.prototype = {
method1 : function(p1){
this.prop1 = p1;
return this;
},
method2 : function(p2){
this.prop2 = p2;
return this;
},
method3 : function(p3){
this.prop3 = p3;
return this;
}
}

定义了function/类ClassA。有三个属性/字段prop1,prop2,prop3,三个方法methed1,method2,method3分别设置prop1,prop2,prop3。
调用如下:
复制代码 代码如下:

var obj = new ClassA();
obj.method1(1).method2(2).method(3); // obj -> prop1=1,prop2=2,prop3=3

可以看到对obj进行了连续三次操作,只要愿意ClassA的N多方法都这样定义,调用链会一直延续。
该方式缺点是链方法唯一地绑定于一种对象类型(ClaaaA),按这种方式实现链式操作,每定义一个类,其方法体中都要返回this。第二种方式可以解决这个问题。
二、函数链:对象传入后每次调用返回函数自身
复制代码 代码如下:

/**
* chain 精简版
* @param {Object} obj
*/
function chain(obj){
return function(){
var Self = arguments.callee; Self.obj = obj;
if(arguments.length==0){
return Self.obj;
}
Self.obj[arguments[0]].apply(Self.obj,[].slice.call(arguments,1));
return Self;
}
}
//定义的function/类ClassB
function ClassB(){
this.prop1 = null;
this.prop2 = null;
this.prop3 = null;
}
ClassB.prototype = {
method1 : function(p1){
this.prop1 = p1;
},
method2 : function(p2){
this.prop2 = p2;
},
method3 : function(p3){
this.prop3 = p3;
}
}

注意ClassB的method1,method2,method3中不再返回this了。
调用如下:
复制代码 代码如下:

var obj = new ClassB();
chain(obj)('method1',4)('method2',5)('method3',6); // obj -> prop1=4,prop2=5,prop3=6

第一种方式3次调用后返回了对象自身,这里使用一个空"()"取回对象
复制代码 代码如下:

// result -> prop1=4,prop2=5,prop3=6
var result = chain(obj)('method1',4)('method2',5)('method3',6)();

这种方式写类时方法体中无须返回this,且可以对任何对象进行链式调用。
两种的调用方式:
复制代码 代码如下:

obj
.method1(arg1)
.method2(arg2)
.method3(arg3)
...
chain(obj)
(method1,arg1)
(method2,arg2)
(method3,arg3)
...

相关:
我的函数链之演变

相关文章

  • sass 中使用 /deep/ 修改 elementUI 组件样式报错的解决方案

    sass 中使用 /deep/ 修改 elementUI 组件样式报错

    这篇文章主要介绍了sass 中使用 /deep/ 修改 elementUI 组件样式报错的解决方案,尝试用 ::v-deep 替换 /deep/ ,成功解决了问题,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • 只需一行代码,轻松实现一个在线编辑器

    只需一行代码,轻松实现一个在线编辑器

    在浏览器地址栏中输入一行代码:data:text/html, <html contenteditable> ,回车即可把浏览器变临时编辑器(需要浏览器支持 HTML5 属性 contenteditable)
    2013-11-11
  • 百度留言本js 大家可以参考下

    百度留言本js 大家可以参考下

    百度留言本js 大家可以参考下。
    2009-10-10
  • javascript去掉前后空格的实例

    javascript去掉前后空格的实例

    在js中去除空格并不是可以直接使用trim来删除,它在js中并不像我们想的那么好用,特别像我要删除前后空格这个trim函数更不可靠了
    2013-11-11
  • js实现圆盘记速表

    js实现圆盘记速表

    本文分享了一个利用AmCharts制作的汽车速度计速表,通过设置不同的速度(数字)来动态改变计速表的指针。使用也非常简单,下面给出方法。
    2015-08-08
  • javascript 组合按键事件监听实现代码

    javascript 组合按键事件监听实现代码

    这篇文章主要介绍了javascript 组合按键事件监听实现代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • uni-app网络请求、数据缓存实例详解

    uni-app网络请求、数据缓存实例详解

    这篇文章主要介绍了uni-app网络请求、数据缓存的相关知识,本文通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • JavaScript股票的动态买卖规划实例分析下篇

    JavaScript股票的动态买卖规划实例分析下篇

    这篇文章主要介绍了JavaScript对于动态规划解决股票问题的真题例举讲解。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Node.js开发指南中的简单实例(mysql版)

    Node.js开发指南中的简单实例(mysql版)

    工作原因需要用到nodejs,于是找到了《node.js开发指南》这本书来看看,作者BYVoid 为清华大学计算机系的高材生,年纪竟比我还小一两岁,中华地广物博真是人才辈出,佩服
    2013-09-09
  • JS 动态加载脚本的4种方法

    JS 动态加载脚本的4种方法

    有时候我们需要动态的加入适合的js,因为有时候不需要将所有的js都加载进来,以来提高效率,但这种方法比较适合单个js文件比较大的情况
    2009-05-05

最新评论