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 相关文章推荐
JavaScript 动态创建VML的方法
Oct 14 Javascript
JavaScript中SQL语句的应用实现
May 04 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
js点击任意区域弹出层消失实现代码
Dec 27 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
js获取隐藏元素的宽高
Feb 24 Javascript
javascript 中的继承实例详解
May 05 Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 Javascript
es6函数中的作用域实例分析
Apr 18 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
Jul 19 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代码实现页面伪静态的方法
2015/07/25 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
一则python3的简单爬虫代码
2014/05/26 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python实现简单的四则运算计算器
2016/11/02 Python
详解Python中的正则表达式
2018/07/08 Python
Linux下python3.7.0安装教程
2018/07/30 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
《与象共舞》教学反思
2014/02/24 职场文书
消防安全宣传口号
2014/06/10 职场文书
班级文化标语
2014/06/23 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
项目战略合作意向书
2015/05/08 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
Android存储中最基本的文件存储方式
2022/04/30 Java/Android
全网非常详细的pytest配置文件
2022/07/15 Python