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整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 Javascript
AngularJS基础教程之简单介绍
Sep 27 Javascript
如何利用JQuery实现从底部回到顶部的功能
Dec 27 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
Apr 25 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
基于JSON数据格式详解
Aug 31 Javascript
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
浅析微信扫码登录原理(小结)
Oct 29 Javascript
video.js 一个页面同时播放多个视频的实例代码
Nov 27 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 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/28 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
javascript 写类方式之二
2009/07/05 Javascript
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
python装饰器练习题及答案
2019/11/01 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
基于Python实现简单学生管理系统
2020/07/24 Python
如何解决python多种版本冲突问题
2020/10/13 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
工程承诺书怎么写
2014/05/24 职场文书
校园广播稿精选
2014/10/01 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
离婚协议书的范本
2015/01/27 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
SSM VUE Axios详解
2021/10/05 Vue.js