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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
javascript 实现动态侧边栏实例详解
Nov 11 Javascript
JavaScript 控制字体大小设置的方法
Nov 23 Javascript
js自制图片放大镜功能
Jan 24 Javascript
微信小程序图片宽100%显示并且不变形
Jun 21 Javascript
React-native桥接Android原生开发详解
Jan 17 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
微信小程序云开发之使用云函数
May 17 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
javascript中的float运算精度实例分析
2010/08/21 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
vue的mixins属性详解
2018/03/14 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
layui原生表单验证的实例
2019/09/09 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
尊老爱幼演讲稿
2014/09/04 职场文书
邓小平理论心得体会
2014/09/09 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
三方股份合作协议书
2014/10/13 职场文书
2014年人事部工作总结
2014/12/03 职场文书
学校开除通知书
2015/04/25 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技