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 相关文章推荐
Web开发者必备的12款超赞jQuery插件
Dec 03 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
Aug 11 Javascript
jQuery自动添加表单项的方法
Jul 13 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
浅谈javascript中new操作符的原理
Jun 07 Javascript
node.js基础知识小结
Feb 26 Javascript
Postman模拟发送带token的请求方法
Mar 31 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
Electron 如何调用本地模块的方法
Feb 01 Javascript
Angular8基础应用之表单及其验证
Aug 11 Javascript
js 图片懒加载的实现
Oct 21 Javascript
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
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中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
php生成mysql的数据字典
2016/07/07 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
bootstrap实现动态进度条效果
2017/03/08 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
Python 发送邮件方法总结
2020/08/10 Python
方法名是否可以与构造器的名字相同
2012/06/04 面试题
应聘教师自荐信
2013/10/12 职场文书
司机的工作范围及职责
2013/11/13 职场文书
创新型城市实施方案
2014/03/06 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
大学新生入学教育方案
2014/05/16 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
行政申诉状范文
2015/05/20 职场文书
历史博物馆观后感
2015/06/05 职场文书
投诉信回复范文
2015/07/03 职场文书
Python编程super应用场景及示例解析
2021/10/05 Python
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers