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 相关文章推荐
Prototype使用指南之selector.js说明
Oct 26 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
Feb 27 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
js中string转int把String类型转化成int类型
Aug 13 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
jQuery实现宽屏图片轮播实例教程
Nov 24 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
有关文件上传 非ajax提交 得到后台数据问题
Oct 12 Javascript
Bootstrap实现各种进度条样式详解
Apr 13 Javascript
Vue实现购物小球抛物线的方法实例
Nov 22 Vue.js
微信小程序中wxs文件的一些妙用分享
Feb 18 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中chdir()函数用法实例
2014/11/13 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
jquery获取当前日期的方法
2015/01/14 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
javascript用rem来做响应式开发
2018/01/13 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Pytorch之保存读取模型实例
2019/12/30 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
中间件分为哪几类
2012/03/14 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
自强之星事迹材料
2014/05/12 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
JS数组去重详情
2021/11/07 Javascript