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 相关文章推荐
简单的JS多重继承示例
Mar 13 Javascript
禁用页面部分JavaScript方法的具体实现
Jul 31 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
May 04 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
avalonjs制作响应式瀑布流特效
May 06 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
深入理解node exports和module.exports区别
Jun 01 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
jQuery简单实现对数组去重及排序操作实例
Oct 31 jQuery
weui中的picker使用js进行动态绑定数据问题
Nov 06 Javascript
js对象简介与基本用法示例
Mar 13 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采用curl实现伪造IP来源的方法
2014/11/21 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python中处理unchecked未捕获异常实例
2015/01/17 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python调用支付宝支付接口流程
2019/08/15 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
python 贪心算法的实现
2020/09/18 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
网络安全方面的面试题
2016/01/07 面试题
什么是SCM(软件配置管理)
2014/08/16 面试题
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
高一新生军训感言
2014/03/02 职场文书
幼儿园标语大全
2014/06/19 职场文书
卖房协议书样本
2014/10/30 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
法定授权委托证明书
2015/06/18 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers