JavaScript中两种链式调用实现代码


Posted in Javascript onJanuary 12, 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) 
...

最后,感谢沐海,我是从wee库中获取以上灵感的。

/201101/yuanma/chain.rar

Javascript 相关文章推荐
使用户点击后退按钮使效三行代码
Jul 07 Javascript
改进版通过Json对象实现深复制的方法
Oct 24 Javascript
纯js代码实现简单计算器
Dec 02 Javascript
angularjs使用directive实现分页组件的示例
Feb 07 Javascript
JavaScript实现二分查找实例代码
Feb 22 Javascript
微信小程序 跳转方式总结
Apr 20 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
node-red File读取好保存实例讲解
Sep 11 Javascript
vue.js的简单自动求和计算实例
Nov 08 Javascript
Vue中多元素过渡特效的解决方案
Feb 05 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 Javascript
Chrome中JSON.parse的特殊实现
Jan 12 #Javascript
js中将字符串转换成json的三种方式
Jan 12 #Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 #Javascript
基于JQuery实现相同内容合并单元格的代码
Jan 12 #Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 #Javascript
Script的加载方法小结
Jan 12 #Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 #Javascript
You might like
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
设定php简写功能的方法
2019/11/28 PHP
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
python字符串对其居中显示的方法
2015/07/11 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
python算法题 链表反转详解
2019/07/02 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
水务局局长岗位职责
2013/11/28 职场文书
党员干部承诺书范文
2014/03/25 职场文书
员工入职担保书范文
2014/04/01 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
大型营销活动计划书
2014/04/28 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
李强优秀员工观后感
2015/06/16 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
python实现Thrift服务端的方法
2021/04/20 Python
带你了解Java中的ForkJoin
2022/04/28 Java/Android