JavaScript中两种链式调用实现代码


Posted in Javascript onJanuary 12, 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) 
...

最后,感谢沐海,我是从wee库中获取以上灵感的。

/201101/yuanma/chain.rar

Javascript 相关文章推荐
清华大学出版的事半功倍系列 javascript全部源代码
May 04 Javascript
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 Javascript
jquery div模态窗口的简单实例
May 28 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
Aug 23 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
angular.js+node.js实现下载图片处理详解
Mar 31 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
Jun 26 Javascript
Ajax实现异步加载数据
Nov 17 Javascript
Chrome中JSON.parse的特殊实现
Jan 12 #Javascript
js中将字符串转换成json的三种方式
Jan 12 #Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 #Javascript
基于JQuery实现相同内容合并单元格的代码
Jan 12 #Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 #Javascript
Script的加载方法小结
Jan 12 #Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 #Javascript
You might like
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
js获取事件源及触发该事件的对象
2013/10/24 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Python timeit模块原理及使用方法
2020/10/10 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
后备干部培训方案
2014/05/22 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
2016新年年会主持词
2015/07/06 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server