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 相关文章推荐
javascript 动态添加表格行
Jun 22 Javascript
给网站上的广告“加速”显示的方法
Apr 08 Javascript
Node.js中对通用模块的封装方法
Jun 06 Javascript
JavaScript中检查对象property的存在性方法介绍
Dec 30 Javascript
jQuery实现的仿百度分页足迹效果代码
Oct 30 Javascript
AngularJS封装$http.post()实例详解
May 06 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
红黑树的插入详解及Javascript实现方法示例
Mar 26 Javascript
vue 父组件调用子组件方法及事件
Mar 29 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
Jun 10 Javascript
解决layUI的页面显示不全的问题
Sep 20 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
967 个函式
2006/10/09 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
用Python编写一个国际象棋AI程序
2014/11/28 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
Python常见异常分类与处理方法
2017/06/04 Python
简述Python2与Python3的不同点
2018/01/21 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
python实现函数极小值
2019/07/10 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
如何用python免费看美剧
2020/08/11 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
小学开学寄语
2014/01/19 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
市场营销计划书
2019/04/24 职场文书