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 相关文章推荐
asp(javascript)全角半角转换代码 dbc2sbc
Aug 06 Javascript
利用location.hash实现跨域iframe自适应
May 04 Javascript
jquery 新浪网易的评论块制作
Jul 01 Javascript
对Jquery中的ajax再封装,简化操作示例
Feb 12 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
JavaScript判断前缀、后缀是否是空格的方法
Apr 15 Javascript
详解vue父子组件间传值(props)
Jun 29 Javascript
JS实现网页抢购功能(触发,终止脚本)
Nov 27 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
微信小程序indexOf的替换方法(推荐)
Jan 14 Javascript
Ant-design-vue Table组件customRow属性的使用说明
Oct 28 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模块化安装教程
2016/06/01 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
IE8 原生JSON支持
2009/04/13 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
js实现数组转换成json
2015/06/26 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
python测试mysql写入性能完整实例
2018/01/18 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
优乐美广告词
2014/03/14 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
法制报告会主持词
2014/04/02 职场文书
名人传读书笔记
2015/06/26 职场文书