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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
使用UglifyJS合并/压缩JavaScript的方法
Mar 07 Javascript
js遍历td tr等html元素
Dec 13 Javascript
jquery读取xml文件实现省市县三级联动的方法
May 29 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
vant组件中 dialog的确认按钮的回调事件操作
Nov 04 Javascript
js实现简易计算器小功能
Nov 18 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python任务调度实例分析
2015/05/19 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
python实现多人聊天室
2020/03/31 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
用python解压分析jar包实例
2020/01/16 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
python 元组的使用方法
2020/06/09 Python
keras 读取多标签图像数据方式
2020/06/12 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
护士年终个人总结
2015/02/13 职场文书
丧事主持词
2015/07/02 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书