JavaScript中链式调用之研习


Posted in Javascript onApril 07, 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) 
...

相关:
我的函数链之演变
Javascript 相关文章推荐
js 键盘记录实现(兼容FireFox和IE)
Feb 07 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
Oct 14 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
jQuery qrcode生成二维码的方法
Apr 03 Javascript
D3.js实现折线图的方法详解
Sep 21 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
Jun 16 Javascript
js HTML5 canvas绘制图片的方法
Sep 08 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 #Javascript
javascript 单例/单体模式(Singleton)
Apr 07 #Javascript
Safari5中alert的无限循环BUG
Apr 07 #Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 #Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 #Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 #Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 #Javascript
You might like
php 数组的一个悲剧?
2011/05/11 PHP
php判断变量类型常用方法
2012/04/24 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
Javascript学习指南
2014/12/01 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
高中运动会广播稿
2014/01/21 职场文书
拉拉队口号
2014/06/16 职场文书
国庆宣传标语
2014/06/30 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
青岛导游词
2015/02/12 职场文书
小学家长意见怎么写
2015/06/03 职场文书
行政处罚告知书
2015/07/01 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
Oracle 多表查询基本语法实例
2022/04/18 Oracle
Win11开始菜单添加休眠选项
2022/04/19 数码科技