如何实现one().plus().two().equalTo()这类链式调用等式求解器
实现支持链式调用的数学运算函数
要实现one().plus().two().equalTo()这类链式调用的运算,核心是让每个函数返回一个包含后续所需方法的对象——你之前的one()直接返回基本类型1,自然没法调用plus()方法。
实现思路
- 设计一个核心类维护当前计算值和待执行的操作(加/减);
- 数字方法(
one()/two())返回类实例,同时完成数值设置或运算执行; - 操作方法(
plus()/minus())标记要执行的运算类型,返回实例以支持链式调用; equalTo()返回最终计算结果。
完整代码实现
class Calculator { constructor() { this.currentValue = 0; this.pendingOperation = null; // 存储待执行的运算类型 } // 数字方法:处理初始值或执行pending运算 one() { this._processNumber(1); return this; } two() { this._processNumber(2); return this; } // 扩展更多数字方法(three()/four()等)同理 three() { this._processNumber(3); return this; } // 运算方法:标记待执行的操作 plus() { this.pendingOperation = 'add'; return this; } minus() { this.pendingOperation = 'subtract'; return this; } // 辅助方法:执行pending运算或设置初始值 _processNumber(num) { if (this.pendingOperation) { switch(this.pendingOperation) { case 'add': this.currentValue += num; break; case 'subtract': this.currentValue -= num; break; } this.pendingOperation = null; // 运算完成后清空标记 } else { this.currentValue = num; // 初始状态直接赋值 } } // 返回最终结果 equalTo() { return this.currentValue; } } // 全局数字函数,返回Calculator实例并初始化数值 function one() { return new Calculator().one(); } function two() { return new Calculator().two(); } function three() { return new Calculator().three(); } // 测试用例 console.log(one().plus().two().equalTo()); // 输出3 console.log(three().minus().one().equalTo()); // 输出2
关键细节说明
- 链式调用的核心:每个方法(
one()/plus()等)都返回this(Calculator实例),这样就能连续调用实例上的其他方法; - 运算执行时机:当调用下一个数字方法时,才会执行之前标记的运算(比如
plus()后调用two(),才会把1和2相加); - 扩展性:要添加更多数字(如
five())或运算(如multiply()),只需在Calculator类中新增对应方法即可。
内容的提问来源于stack exchange,提问作者Tej doshi
相关产品推荐
相关产品推荐

