JavaScript中链式调用之研习


Posted in Javascript onApril 07, 2011

一、对象链:方法体内返回对象实例自身(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) 
...

相关:
我的函数链之演变
Javascript 相关文章推荐
jQuery 获取URL参数的插件
Mar 04 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
Jun 23 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
Bootstrap每天必学之警告框插件
Apr 26 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
setTimeout时间设置为0详细解析
Mar 13 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
Node.js 使用axios读写influxDB的方法示例
Oct 26 Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 #Javascript
javascript 单例/单体模式(Singleton)
Apr 07 #Javascript
Safari5中alert的无限循环BUG
Apr 07 #Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 #Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 #Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 #Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 #Javascript
You might like
php打开文件fopen函数的使用说明
2013/07/05 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
JavaScript 原型继承
2011/12/26 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
js实现日历的简单算法
2017/01/24 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
python 实现IP子网计算
2021/02/18 Python
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
公司晚会主持词
2014/03/22 职场文书
丧事主持词大全
2014/04/02 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
毕业横幅标语
2014/10/08 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
七年级话题作文之执着
2019/11/19 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android