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中的View-Model使用介绍
Aug 11 Javascript
javascript实现的简单计时器
Jul 19 Javascript
jQuery实现的右下角广告窗体跟随效果示例
Sep 16 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
ES6中Iterator与for..of..遍历用法分析
Mar 31 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
JS switch判断 三目运算 while 及 属性操作代码
Sep 03 Javascript
vue+iview+less+echarts实战项目总结
Feb 22 Javascript
微信小程序使用字体图标的方法
May 23 Javascript
微信公众号网页分享功能开发的示例代码
May 27 Javascript
JavaScript实现音乐播放器
Aug 14 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
PHP+DBM的同学录程序(5)
2006/10/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
学生实习推荐信范文
2013/11/26 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
退学证明范本3篇
2014/10/29 职场文书
个人自荐书范文
2015/03/09 职场文书
夏洛特的网观后感
2015/06/15 职场文书
新教师教学工作总结
2015/08/12 职场文书
家访教师心得体会
2016/01/23 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang