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 相关文章推荐
找到一点可怜的关于dojo资料,谢谢作者!
Dec 06 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
Mar 13 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
Javascript中关于Array.filter()的妙用详解
Dec 04 Javascript
Bootstrap警告(Alerts)的实现方法
Mar 22 Javascript
JS 60秒后重新发送验证码的实例讲解
Jul 26 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
小程序自定义日历效果
Dec 29 Javascript
vue中input的v-model清空操作
Sep 06 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 Javascript
React如何创建组件
Jun 27 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
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
理解javascript闭包
2015/12/15 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
通过cmd进入python的实例操作
2019/06/26 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
详解rem 适配布局
2018/10/31 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
如何理解委托
2012/01/06 面试题
青年志愿者活动总结
2014/04/26 职场文书
初中教师业务学习材料
2014/05/12 职场文书
违纪开除通知书
2015/04/25 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技