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应该怎样学
Apr 16 Javascript
javascript一些不错的函数脚本代码
Sep 10 Javascript
javascript放大镜效果的简单实现
Dec 09 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
纯原生js实现table表格的增删
Jan 05 Javascript
Angular2 组件交互实例详解
Aug 24 Javascript
Bootstrap一款超好用的前端框架
Sep 25 Javascript
JavaScript寄生组合式继承实例详解
Jan 06 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 Javascript
JavaScript控制台的更多功能
Apr 28 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 4.2书写安全的脚本
2006/10/09 PHP
实用函数10
2007/11/08 PHP
10条PHP编程习惯助你找工作
2008/09/29 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python tkinter常用操作代码实例
2020/01/03 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
django使用多个数据库的方法实例
2021/03/04 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
自荐信写法介绍
2014/01/25 职场文书
文明学生事迹材料
2014/01/29 职场文书
企业指导教师评语
2014/04/28 职场文书
房屋维修协议书范本
2014/09/25 职场文书
2014年纪检工作总结
2014/11/12 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
小学生节水倡议书
2015/04/29 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
python基于turtle绘制几何图形
2021/06/15 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL