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写个checkbox——类似邮箱全选功能
Mar 19 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
JS添加删除DIV的简单实例
Jul 08 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
Aug 14 Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 Javascript
原生js实现弹幕效果
Nov 29 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之数据库操作详解及乱码解决!
2007/01/02 PHP
开发大型 PHP 项目的方法
2007/01/02 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
解析php中memcache的应用
2013/06/18 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
学习ExtJS table布局
2009/10/08 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
RequireJs的使用详解
2017/02/19 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
快速了解Node中的Stream流是什么
2019/02/13 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
python生成随机mac地址的方法
2015/03/16 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
python中cPickle类使用方法详解
2018/08/27 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
火锅店营销方案
2014/02/26 职场文书
三年级评语大全
2014/04/23 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题