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 相关文章推荐
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
JS画5角星方法介绍
Sep 17 Javascript
jQuery中.live()方法的用法深入解析
Dec 30 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
详解javascript表单的Ajax提交插件的使用
Dec 29 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
解决vue attr取不到属性值的问题
Sep 18 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替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
详解node child_process模块学习笔记
2018/01/24 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python configparser模块应用过程解析
2020/08/14 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
Ajax的优点和缺点
2014/11/21 面试题
高校毕业生自我鉴定
2013/10/27 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
创建文明学校实施方案
2014/03/11 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
Pytorch可视化的几种实现方法
2021/06/10 Python
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python