Javascript中的方法链式调用

Stella981
• 阅读 804

Javascript中的方法链式调用

    • 前言
    • 为链式调用创建一个对象
    • 为什么报错?
    • 解决方法
    • 使用闭包实现链式调用

前言

方法的链式调用这个概念,其实是在面向对象编程中比较常见的语法,它能让使用者在一个对象上连续的调用不同的方法。在不使用临时变量存储中间结果的情况下完成一条语句上多个方法的连续调用。

在使用jquery的过程中,会经常用到链式调用,比如:

$('#forevercjl').addClass('px').removeClass('xp');

下面我们就用一个简单计算器对象例子,来模拟实现这样的链式调用。

为链式调用创建一个对象

首先我们用函数创建一个对象:

const calObj = function(){
   
   }

由于是计算器对象,那么它需要包含以下属性和方法

  • num 属性,用于存储当前计算器的结果值
  • add 方法,给num加值
  • min 方法,给num减值
  • clear 方法,num置0

代码如下:

const calObj = function(){
   
   
    this.num = 0;
    
    this.add = function(number){
   
   
        this.num = this.num + number;
    }
    
    this.min = function(number){
   
   
        this.num = this.num - number;
    }
    
    this.clear = function(){
   
   
        this.num = 0;
    }
}

然后尝试调用一下,实现0+1的效果

const co = new calObj();
co.add(1); //1

如果我们在调用完add方法,还想继续减一个数,实现 0+1-2的效果,那应该这样写:

const co = new calObj();
co.add(1).min(2); //Uncaught TypeError: Cannot read property 'min' of undefined at <anonymous>:2:10

执行完上面代码后,会发现直接报错了,提示找不到min方法。

为什么报错?

在上面定义的calObj对象的add方法中,我们并没有显示的指定其返回值,所以实际上他在执行完之后,会返回undefined。在undefined上调用min方法,那必然会报错。

解决方法

如果想要在调用add方法之后,又可以立即调用min方法,其实只需要给add方法增加一个return this就行了。就是这么简单,把对象自身的引用返回出去。

const calObj = function(){
   
   
    this.num = 0;
    
    this.add = function(number){
   
   
        this.num = this.num + number;
        return this;
    }
    
    this.min = function(number){
   
   
        this.num = this.num - number;
        return this;
    }
    
    this.clear = function(){
   
   
        this.num = 0;
        return this;
    }
}

这个时候我们调用任何一个方法,都会返回对象本身

const co = new calObj();
console.log(co.add(1)); 

Javascript中的方法链式调用
现在无论调动哪个方法,都可以通过链式写法继续调用对象的其他方法,直到你不想再调用为止。

回到前面说的到0+1-2的实现代码,现在就能正常调用了:

const co = new calObj();
co.add(1).min(2); //-1

使用闭包实现链式调用

在不使用new的情况下,能否实现链式调用呢?答案必然是可以的,只需要利用闭包就能实现。

const calObj = function(){
   
   
    let num = 0;
    
    let add = function(number){
   
   
        num = num + number;
        return this;
    }
    
    let min = function(number){
   
   
        num = num - number;
        return this;
    }
    
    let clear = function(){
   
   
        num = 0;
        return this;
    }    
    return {
   
   
        add,
        min,
        clear
    }    
}

这样就可以不用new一个obj来使用链式调用了。

const co = calObj();
co.add(1).min(2);  //-1
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java反射大全
作者对反射的理解:方法的调用(正常的调用:对象.方法()。反射调用方法:方法.对象())静态属性的调用(正常的调用:类.属性。反射调用:属性.类)常见反射的用法:        1.通过反射获取类Class<?demo1Class
Wesley13 Wesley13
3年前
java基础类库
java类库的基本介绍与用户互动运行Java程序的参数main()方法分析public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main()方法,所以使用public修饰符把这个方法暴露出来static修饰符:JVM调用这个主方法时,不会先创建该类的对象,然后通过对象来调用该主方法
待兔 待兔
4年前
Java多态实现原理
Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c
Stella981 Stella981
3年前
Lombok使用4:链式调用
本篇文章会讲到:@Accessors、@Builder注解使用。1、@Accessors使用@Accessors官方文档地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fprojectlombok.org%2Ffeatures%2Fexperimental%
可莉 可莉
3年前
10.3 UiPath如何调用Java
调用Java方法(InvokeJavaMethod)的介绍从JavaScope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、InvokeJavaMethod在UiPath中的使用打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路径,在Activities中搜索Ja
Stella981 Stella981
3年前
MyBatis插件开发
MyBatis插件开发一、前言MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果。MyBatis允许在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包
Stella981 Stella981
3年前
Promise 多重链式调用
Promise对象是用于异步操作的。Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢?使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。以下是个小Demo:/e.g/sen
Wesley13 Wesley13
3年前
Java RMI使用
什么是RMIRMI,全称RemoteMethodInvoke,远程方法调用。它能够让在某个Java虚拟机上的对象调用另一个Java虚拟机中的对象上的方法。它的强大之处就体现在开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调
Easter79 Easter79
3年前
Spring概念和Bean管理(配置文件)
Spring概念1.spring是开源的轻量级框架(免费,依赖少,可以直接使用)2.spring核心主要两部分:  (1)aop:面向切面编程,扩展功能不是修改源代码实现  (2)ioc:控制反转,  比如有个类,在类里面有个方法(不是静态方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创
Wesley13 Wesley13
3年前
Go语言方法的 值接受者 和 指针接受者 的区别
首先说下结论1\.无论方法的接受者是值接受者还是指针接受者,对象值调用该方法和对象指针调用该方法都是可行的。2\.当方法接受者为指针接受者时,对象的值调用该方法和指针调用该方法都会操作对象本身。3\.当方法接受者为值接受者时,对象的值调用该方法和指针调用该方法都会操作对象的副本,对对象本身无影响。pack