Javascript中的方法链式调用

Javascript中的方法链式调用

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

前言

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

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

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

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

为链式调用创建一个对象

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

1const calObj = function(){ 2 3 }

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

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

代码如下:

1const calObj = function(){ 2 3 4 this.num = 0; 5 6 this.add = function(number){ 7 8 9 this.num = this.num + number; 10 } 11 12 this.min = function(number){ 13 14 15 this.num = this.num - number; 16 } 17 18 this.clear = function(){ 19 20 21 this.num = 0; 22 } 23}

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

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

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

1const co = new calObj(); 2co.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就行了。就是这么简单,把对象自身的引用返回出去。

1const calObj = function(){ 2 3 4 this.num = 0; 5 6 this.add = function(number){ 7 8 9 this.num = this.num + number; 10 return this; 11 } 12 13 this.min = function(number){ 14 15 16 this.num = this.num - number; 17 return this; 18 } 19 20 this.clear = function(){ 21 22 23 this.num = 0; 24 return this; 25 } 26}

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

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

在这里插入图片描述
现在无论调动哪个方法,都可以通过链式写法继续调用对象的其他方法,直到你不想再调用为止。

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

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

使用闭包实现链式调用

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

1const calObj = function(){ 2 3 4 let num = 0; 5 6 let add = function(number){ 7 8 9 num = num + number; 10 return this; 11 } 12 13 let min = function(number){ 14 15 16 num = num - number; 17 return this; 18 } 19 20 let clear = function(){ 21 22 23 num = 0; 24 return this; 25 } 26 return { 27 28 29 add, 30 min, 31 clear 32 } 33}

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

1const co = calObj(); 2co.add(1).min(2); //-1
点赞
收藏

评论区

加载中...

相关推荐

java反射大全

作者对反射的理解:方法的调用(正常的调用:对象.方法()。反射调用方法:方法.对象())静态属性的调用(正常的调用:类.属性。反射调用:属性.类)常见反射的用法:        1.通过反射获取类Class<?demo1Class

Java多态实现原理

Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c

Lombok使用4:链式调用

本篇文章会讲到:@Accessors、@Builder注解使用。1、@Accessors使用@Accessors官方文档地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fprojectlombok.org%2Ffeatures%2Fexperimental%

10.3 UiPath如何调用Java

调用Java方法(InvokeJavaMethod)的介绍从JavaScope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、InvokeJavaMethod在UiPath中的使用打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路径,在Activities中搜索Ja

MyBatis插件开发

MyBatis插件开发一、前言MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果。MyBatis允许在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包

Promise 多重链式调用

Promise对象是用于异步操作的。Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢?使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。以下是个小Demo:/e.g/sen

Javascript中的方法链式调用 - HelloWorld