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 相关文章推荐
20个非常棒的Jquery实用工具 国外文章
Jan 01 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
js跨域访问示例(客户端/服务端)
May 19 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
Mar 26 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
Dec 14 Javascript
几种响应式文字详解
May 19 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
es6 super关键字的理解与应用实例分析
Feb 15 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制作简单的内容采集器的原理分析
2008/10/01 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
javascript实现计算器功能
2020/03/30 Javascript
python实现在IDLE中输入多行的方法
2018/04/19 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
工程业务员岗位职责
2013/12/31 职场文书
学员自我鉴定
2014/03/19 职场文书
园艺师求职信
2014/04/27 职场文书
2014年优秀党员材料
2014/12/18 职场文书
英文导游词
2015/02/13 职场文书
三国演义读书笔记
2015/06/25 职场文书
如何理解及使用Python闭包
2021/06/01 Python
Vue操作Storage本地化存储
2022/04/29 Vue.js