优雅的函数式编程「链式调用」

完完全全把函数式编程写出来有点扛不住,很多也都用不上,聊聊比较常见的链式操作,我对链式操作的一些理解。

先上一段代码让大家知道链式是什么样的:$("#idName").show().css("color","red")
链式调用的代表:Jquery,使用过Jquery的攻城狮们应该都深有感触,连式操作是Jquery最具魅力的亮点之一。如果你还沉迷其中而没时间掀开它神秘的小裤裤,那接下来,嘿嘿···

⚧链式操作的三体

  • 能够进行链式操作的对象:链式对象 chainObject
  • 链式对象上能进行链式操作的方法:链式方法chainToDo()
  • 链式操作最终想要获得结果是通过被操作数据:链式数据chainData

以下是一个简单的链式操作代码,我们在此基础上慢慢讲解,慢慢优化

var chainObject = {
    chainData: 1,
    chainToDo: function(){
        this.chainData += 1;
        return this
    }
}
chainObject.chainToDo().chainToDo();
console.log(chainObject.chainData);
⚦链式对象chainObject

链式操作的载体,链式对象是一个属性及方法的集合,特别的地方在于chainObject在每次调用一个方法(chainObject.chainToDo)时,这个方法都会returnchainObject对象本身,这个对象又具有执行同样操作的方法,如此循环,于是形成了我们想要的函数执行链条chainObject.chainToDo().chainToDo().chainToDo()···

♂链式方法chainToDo()

在上面的例子函数中,我们最终想要获知chainObject.chainData的最终值,链式操作是可以了,但每一次酣畅淋漓的操作后,还得打扫战场,就很不愉快了。
于是链式方法,我们可以优化为两种

  • nextTodo:可以返回对象本身return this的方法,可进行下一步操作
  • endDo :可以想要的结果return this.chainData的方法,由于返回的是对象自带的数据,而不是对象本身,无法继续链式操作,链式操作结束,是作为链式操作终止符的存在。
var chainObject = {
    chainData: 1,
    chainToDo: function(){
        this.chainData += 1;
        return this
    },
    chainEndDo : function(){
         return this.chainData
    }
}
var resultData = chainObject.chainToDo().chainToDo().chainEndDo();//获取最终结果数据
♁链式数据chainData

链式操作的桥梁,chainData作为媒介一样的东西,让每次链式操作都具有意义,因为链式方法中的nextTodo每次都是返回一个可供下次操作的对象,如果没有这么一个媒介,链式调用可能只是一长串无意义的函数串。
这个媒介可以是在对象字面量中,也可以是在上一级的作用域中,

♔基于JS原型链的链式操作优化

JS原型链搭配链式操作,我们可以很方便的在一类对象上复用,只需要如下代码

var ChainObject
ChainObject.prototype = {
    chainData: 1,
    chainToDo: function(){
        this.chainData += 1;
        return this
    },
    chainEndDo : function(){
         return this.chainData
    }
}
var obj = new ChainObject
var resultData = obj.chainToDo().chainToDo().chainEndDo();//获取最终结果数据

每个实例都可以使用相同的链式方法;
其实我们常见的map,filter等一些数组方法,本来就是可以进行链式操作;

var arr = [1,2,3,4] ;
arrData = arr.map((item)=>{retrun item*2})
             .filter()
             .reduce()

map,filter都返回了一个新的数组,而只要是数组都具有原生的方法。

♔使用情况分析

学到一种新的技术,可能总会出现,学了没法用,或者学了过段时间又忘记的情况。如果读了这篇文章后,觉得还是很有用,希望接下来,带着一些疑惑,思考一下我们如果在自己的代码中使用,让自己写的代码更优雅。

常见的函数function(){return a+1},分解为两个函数,一个用来计算,一个用来返回结果,如果将两个函数挂在到一个链式对象上,其实就是一个简单的两步链式调用obj.addData().getResult()。结果就是,不是链式调用在什么情况下使用,而是你想在什么地方使用链式调用

使用链式调用时,一般要考虑的是,处理步骤较为复杂的的事物,链式调用能够让我们清楚的知道要做什么以及下一步将要做什么。将复杂的逻辑调理化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,692评论 0 5
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,271评论 0 13
  • 01 昨天,我很忧伤和我的老大说: “老大,我不想干了,我要离职了,这不是开玩笑。我受够了这种粘贴,复制的日子。这...
    南雪夕阅读 1,095评论 14 8
  • 有孩子好啊,可以写写孩子 择花生择得我都不知道回家几天了,总想着每天择些择些,啥时候能择完。今天和韩雪聊,她让我赶...
    林馨儿_d1d3阅读 183评论 0 0