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 相关文章推荐
JQuery 小练习(实例代码)
Aug 07 Javascript
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
微信小程序图表插件(wx-charts)实例代码
Jan 17 Javascript
vue动态生成dom并且自动绑定事件
Apr 19 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
Jul 07 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
在vue中使用echars实现上浮与下钻效果
Nov 08 Javascript
JS数据类型STRING使用实例解析
Dec 18 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学习之简单计算器实现代码
2011/06/09 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
Prototype Number对象 学习
2009/07/19 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
vue 组件简介
2020/07/31 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
Python 操作MySQL详解及实例
2017/04/30 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
基于python实现雪花算法过程详解
2019/11/16 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
保证书格式范文
2014/04/28 职场文书
数学教师个人总结
2015/02/06 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
观后感格式
2015/06/19 职场文书
辩论会主持词
2015/07/03 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
干部考核工作总结
2015/08/12 职场文书