Javascript中的方法链(Method Chaining)介绍


Posted in Javascript onMarch 15, 2015

在寻找如何设计一个Javascript API的时候,发现了Method Chaining这个东西,方法链,看上去似乎很强大,也挺有意思的,而这个东西也是过去我们经常看到的。。

Javascript Method Chaining

在维基百科上有这样的解释:

Method chaining, also known as named parameter idiom, is a common syntax for invoking multiple method calls in object-oriented programming languages. Each method returns an object, allowing the calls to be chained together in a single statement.Chaining is syntactic sugar which eliminates the need for intermediate variables. A method chain is also known as a train wreck due to the increase in the number of methods that come one after another in the same line that occurs as more methods are chained togethe even though line breaks are often added between methods.

拿翻译工具翻译了一下:

方法链,也被称为命名参数法,是在面向对象的编程语言调用的调用多个方法的通用语法。每一个方法返回一个对象,允许电话连接到一起,在一个单一的声明。链接是语法糖,省去了中间变量的需要。方法链也被称为火车残骸中由于方法来相继发生的同一行以上的方法都锁在即使换行通常添加方法间的数量增加。

Method Chaining 使用

目测对于方法链用得最多的,应该就是jQuery了。

// chaining

$("#person").slideDown('slow')

   .addClass('grouped')

   .css('margin-left', '11px');

我们可以用这样的用法来调用这个。jQuery严重依赖于链接。这使得它很容易调用的几个方法相同的选择。这也使得代码更清晰和防止执行相同的选择几次(提高性能)。没有方法链的时候则是下面的样子
var p = $('#person');

p.slideDown('slow');

p.addClass('grouped');

p.css('margin-left', '11px');

看上去和设计模式中的builder很像,不同的是,这里的p是方法,而不是一个类。

Javascript 方法链示例

在之前我们说到Javascript 高阶函数 的时候,说到的print('Hello')('World'),而这种用法的结果可能会变成这样子。

function f(i){

  return function(e){

    i+=e;

    return function(e){

      i+=e;

      return function(e){

        alert(i+e);

      };

    };

  };

};

f(1)(2)(3)(4); //10

这是网上的一个例子,然而也是我上一次写链式调用的作法。看上去弱爆了。
var func = (function() {

    return{

        add: function () {

            console.log('1');

            return{

                result: function () {

                    console.log('2');

                }

            }

        }

    }

})();
func.add().result();

实际上应该在每个function都要有个return this,于是就有了:
Func = (function() {

    this.add = function(){

        console.log('1');

        return this;

    };

    this.result = function(){

        console.log('2');

        return this;

    };

    return this;

});
var func = new Func();

func.add().result();

当然我们也可以将最后的两句
var func = new Func();

func.add().result();

变成
new Func().add().result();

其他

最后作为一个迷惑的地方的小比较:

Method Chaining VS prototype Chaining

原型链与方法链在某些方面上是差不多的,不同的地方或许在于

1.原型链是需要用原型
2.方法链则是用方法

Javascript 相关文章推荐
jQuery 打造动态渐变按钮 详细图文教程
Apr 25 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
js使用心得分享
Jan 13 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
Sep 23 Javascript
利用JS判断鼠标移入元素的方向
Dec 11 Javascript
深入理解js中的加载事件
Feb 08 Javascript
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
Javascript中的apply()方法浅析
Mar 15 #Javascript
Javascript中的Callback方法浅析
Mar 15 #Javascript
Javascript中的call()方法介绍
Mar 15 #Javascript
Javascript中的高阶函数介绍
Mar 15 #Javascript
Javascript中this关键字的一些小知识
Mar 15 #Javascript
Javascript URI 解析介绍
Mar 15 #Javascript
PHP+jQuery+Ajax实现多图片上传效果
Mar 14 #Javascript
You might like
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
js中的闭包实例展示
2018/11/01 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python异常学习笔记
2015/02/03 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
领导视察欢迎词
2014/01/15 职场文书
十八大报告观后感
2014/01/28 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
运动会方阵口号
2014/06/07 职场文书
中秋晚会策划方案
2014/06/12 职场文书
毕业生党员个人总结
2015/02/14 职场文书
结婚堵门保证书
2015/05/08 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
小学家长意见怎么写
2015/06/03 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
MongoDB 常用的crud操作语句
2021/06/20 MongoDB