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 相关文章推荐
Javascript 各浏览器的 Javascript 效率对比
Jan 23 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
Dec 04 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
jQuery实现简单隔行变色的方法
Feb 20 Javascript
JavaScript中的闭包
Feb 24 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
Node.js 使用request模块下载文件的实例
Sep 05 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/10/28 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
详解php命令注入攻击
2019/04/06 PHP
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python的多态性实例分析
2015/07/07 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
python中update的基本使用方法详解
2019/07/17 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
pandas实现导出数据的四种方式
2020/12/13 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
优秀团队申报材料
2014/12/26 职场文书
公司员工体检通知
2015/04/21 职场文书
钱学森观后感
2015/06/04 职场文书