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 相关文章推荐
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
Jquery 数组操作大全个人总结
Nov 13 Javascript
javascript将DOM节点添加到文档的方法实例分析
Aug 04 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 Javascript
JS实现重新加载当前页面
Nov 29 Javascript
javascript ASCII和Hex互转的实现方法
Dec 27 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
原生js实现轮播图特效
May 04 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 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获取页面title例子
2015/01/07 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python脚本内运行linux命令的方法
2015/07/02 Python
详解python3中tkinter知识点
2018/06/21 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
.NET面试10题
2014/02/24 面试题
俄罗斯商务邀请函
2014/01/26 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
结婚喜宴主持词
2014/03/14 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
教师个人考察材料
2014/12/16 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js