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 相关文章推荐
js兼容标准的表格变色效果
Jun 28 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
jQuery 滑动方法slideDown向下滑动元素
Jan 16 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
js微信分享实现代码
Oct 11 Javascript
解决vue 打包发布去#和页面空白的问题
Sep 04 Javascript
浅谈Javascript中的对象和继承
Apr 19 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
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
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python表示矩阵的方法分析
2017/05/26 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
python 自动去除空行的实例
2018/07/24 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
大学生表扬信范文
2014/01/09 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Python集合set()使用的方法详解
2022/03/18 Python
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL