You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类中非函数形式的result属性以支持方法链式调用?

实现链式调用末尾直接获取计算结果的方案

需求说明

需要修改现有Library类,使得执行var x = $.add(3,5).add(5,10).subtract(10).result;时,x直接得到计算结果23(而非函数);执行var y = $.add(3,5).add(5,10).subtract(10,3,5).result时得到15。原代码中result是函数形式,无法满足该需求。

原代码

class Library {
    constructor(a){
        this.total = a;
    }
            
    add(...a){
        for (const arg of a) {
              this.total += arg;
        }
        return this;
    }
    
    subtract(...b){
        for (const args of b) {
          this.total -= b;
        }
        return this;
    }
        
    result() {
        console.log(this.total);
        return this.total
    }
}

$ = new Library(10); // 初始值设为10

// 期望调用方式:
// var x = $.add(3,5).add(5,10).subtract(10).result;    
// x 应为 10+3+5+5+10-10 = 23
// var y = $.add(3,5).add(5,10).subtract(10,3,5).result 应返回15

解决方案

通过类的getter访问器属性实现,同时修复subtract方法的逻辑错误:

class Library {
    constructor(a){
        this.total = a;
    }
            
    add(...a){
        for (const arg of a) {
              this.total += arg;
        }
        return this;
    }
    
    subtract(...b){
        // 修复bug:将 this.total -= b 改为 this.total -= args
        for (const args of b) {
          this.total -= args;
        }
        return this;
    }
        
    // 将result定义为getter属性
    get result() {
        console.log(this.total);
        return this.total;
    }
}

$ = new Library(10);

// 测试调用
var x = $.add(3,5).add(5,10).subtract(10).result;    
console.log(x); // 输出23

// 重置实例重新测试y的场景
$ = new Library(10);
var y = $.add(3,5).add(5,10).subtract(10,3,5).result;
console.log(y); // 输出15

关键说明

  • getter属性的特性:当访问instance.result时,会自动执行get result()中的逻辑并返回值,不需要加括号调用
  • 修复subtract方法:原代码中this.total -= b会把整个参数数组b作为数值减去,导致计算错误,改为this.total -= args才是逐个减去传入的参数

内容的提问来源于stack exchange,提问作者Happy Crypto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:57:06