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中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
jQuery实现的五子棋游戏实例
Jun 13 Javascript
Jquery基础教程之DOM操作
Aug 19 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
Feb 22 Javascript
JS控制静态页面传递参数并获取参数应用
Aug 10 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
JS数组Reduce方法功能与用法实例详解
Apr 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加密解密函数代码
2013/06/19 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
IE8 中使用加速器(Activities)
2010/05/14 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
python 字典(dict)按键和值排序
2016/06/28 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
python与C互相调用的方法详解
2017/07/14 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
英国网上购买门:Direct Doors
2018/06/07 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
智能钱包:Ekster
2019/11/21 全球购物
学生会离职感言
2014/02/11 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
党员三严三实心得体会
2014/10/13 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
公司经营目标责任书
2015/01/29 职场文书
英语导游词
2015/02/13 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
优秀大学生申请书
2019/06/24 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js