无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性。一个很好的例子是字符串的replace方法。由于结果本身也是字符串,可以对前一个replace操作重复执行替换。这种模式的一个常见用例是在将字符串插入到HTML前替换字符串的特殊字符字母。

function escapeBasicHTML(str){
return str.replace(/&/g,"&")
.replace(/< /g,"&lt;")
.replace(/>/g,"&gt;")
.replace(/"/g,"&quot;")
.replace(/'/g,"&apos;");
}

对replace的第一次调用返回一个将所有特殊字符"&"替换为HTML字符串的转义序列“&”的字符串;以此类推。这种重复的方法调用风格叫做方法链。这种风格不需要保存中间结果为变量,更简洁。jquery就是一个很好的例子。

function escapeBasicHTML(str){
var str2=str.replace(/&/g,"&amp;")
var str3=str2.replace(/< /g,"&lt;")
var str4=str3.replace(/>/g,"&gt;")
var str5=str4.replace(/"/g,"&quot;")
var str6=str5.replace(/'/g,"&apos;");
return str6;
}

消除临时变量使代码变得更加可读,中间结果只是得到最终结果中的一个重要的步骤而已。
如果一个API产生了一个接口对象,调用这个接口对象的方法产生的对象如果具有相同的接口,那么就可以使用方法链。如前面50条和51条中描述的数组迭代方法就是另一个链式API。

var users=records.map(function(record){
return record.username;
})
.filter(function(username){
return !!username;
})
.map(function(username){
return username.toLowerCase();
});

因为数组的每一种迭代方法,返回得都是一个数组。可以方便地再使用数组方法进行处理。
这种风格非常灵活,并且对于API的使用者富有表现力,所以将API设计为支持这种风格是值得的。
通常情况下,
无状态的API中,如果API不修改对象,而是返回一个新对象,则链式得到了自然的结果。因此,API的方法提供了更多相似方法集的对象。
有状态的API中,这里的技巧是方法在更新对象时返回this,而不是undefined。这使得通过链式方法调用的序列来对同一个对象执行多次更新成为可能。

element.setBackgroundColor('yellow')
.setColor('red')
.setFontWeight('bold');

有状态的API的方法有时被称为流畅式。如果更新方法没返回this,那么API的调用者不得不每次重复该对象的名称。如果该对象被简单命名为一个变量,这没有什么区别。但当结合无状态的方法用于检索更新的对象,方法链非常简洁,并且代码更可读。jquery中的方法普遍采用这种方法。它有一组(无状态的)方法用于从用户界面元素中查询网页,还有一组(有状态的)方法用于更新这些元素。

$('#notification')
.html('Server not responding.')
.removeClass('info')
.addClass('error');

通过调用有状态的html,removeClass,addClass方法而返回相同对象来支持流畅式,不用创建临时变量存储jQuery函数执行查询的结果。如果觉得这种风格不太习惯,也可以添加中间变量来存储各函数的返回值。

var element=$('#notification');
element.html('Server not responding.');
element.removeClass('info');
element.addClass('error');

通过支持方法链,API允许程序员按自己的喜好选择风格。如果方法返回undefined,用户会被强迫使用更啰嗦的风格。

提示

  • 使用方法链来连接无状态的操作

  • 通过在无状态的方法中返回新对象来支持方法链

  • 通过在有状态的方法中返回this来支持方法链

[Effective JavaScript 笔记]第60条:支持方法链的更多相关文章

  1. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  2. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  3. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  4. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  5. [Effective JavaScript 笔记]第42条:避免使用轻率的猴子补丁

    41条对违反抽象原则行为的讨论之后,下面聊一聊终极违例.由于对象共享原型,因此每一个对象都可以增加.删除或修改原型的属性.这个有争议的实践通常称为猴子补丁. 猴子补丁示例 猴子补丁的吸引力在于其强大. ...

  6. [Effective JavaScript 笔记]第68条:使用promise模式清洁异步逻辑

    构建异步API的一种流行的替代方式是使用promise(有时也被称为deferred或future)模式.已经在本章讨论过的异步API使用回调函数作为参数. downloadAsync('file.t ...

  7. [Effective JavaScript 笔记]第65条:不要在计算时阻塞事件队列

    第61条解释了异步API怎样帮助我们防止一段程序阻塞应用程序的事件队列.使用下面代码,可以很容易使一个应用程序陷入泥潭. while(true){} 而且它并不需要一个无限循环来写一个缓慢的程序.代码 ...

  8. [Effective JavaScript 笔记] 第2条:理解JavaScript的浮点数

    JavaScript数值型类型只有数字 js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字. typeof 17;   // “number” typeof 98.6; // “num ...

  9. [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数

    第21条讲述使用可变参数的函数average.该函数可处理任意数量的参数并返回这些参数的平均值. 如何创建可变参数的函数 1.实现固定元数的函数 书上的版本 function averageOfArr ...

随机推荐

  1. EF实体框架之CodeFirst八

    前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...

  2. C#Json序列化和反序列化

    1.动态决定数据是否要序列化 我的需求是这样的,我用了一款数据库的组件叫Dos.ORM,确实方便了不少,但是在用的时候,我发现一个问题,比如我定义的表中有一个字段添加时间,修改时间,这些都是默认的,在 ...

  3. $self $index $first $last parent() outerParent()

    index5.html <html><head> <title>$self $index $first $last parent() outerParent()&l ...

  4. Bootstrap3.0学习第十二轮(导航、标签、面包屑导航)

    详情请查看http://aehyok.com/Blog/Detail/18.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  5. jQuery基础之(三)jQuery功能函数前缀及与window.onload冲突

    1.jQuery功能函数前缀 在javascript中,开发者通常会编写一些小函数来处理各种操作细节,例如在用户提交表单时,要将文本框最前端和最末端的空格内容清理掉.而javascript中没有类似t ...

  6. VMware v12.1.1 专业版以及永久密钥

    热门虚拟机软件VMware Workstation 现已更新至v12.1.1 专业版!12.0属于大型更新,专门为Win10的安装和使用做了优化,支持DX10.4K高分辨率显示屏.OpenGL 3.3 ...

  7. 调研Android Studio开发环境的发展演变(附安装教程,多图)

    Android Studio(以下简称AS)第一次公开亮相是在2013年的谷歌I/O大会上,14年的大会上谷歌发布其试用测试版,如今AS已经历数次版本更新,功能十分强大.如(摘自百度百科Android ...

  8. keep_on _coding——js_good_parts

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Java设计模式-备忘录模式(Memento)

    主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C ...

  10. sql-数据库的隔离级别

    read uncommited  (读未提交)      最低级别,可读取未提交事物的数据,这会导致脏读,比如:某时刻会话a修改了一个数据,但还未提交,此时会话b,读取了该数据,这是,会话a回滚了事物 ...