这是在javascript中实现链接的正确方法吗?

Is this the right way to implement chaining in javascript?

本文关键字:方法 链接 javascript 实现      更新时间:2023-09-26

在线阅读后,我编写了这个简单的代码,通过链接进行加法和乘法。但是阅读代码,在我看来,方法"结果"使代码的可读性降低,并且似乎是多余的。有人可以帮助我摆脱结果函数吗?

var Calculator = function () {
    var result = 0;
    this.Add = function (x) {
        result = result + x;
        return this;
    };
     this.Multiply = function (x) {
        result = result * x;
        return this;
    };
    this.Result = function () {
        return result;
    }
};

var total = new Calculator().Add(2).Add(3).Multiply(5);
alert(total.Result());

我想要实现的是

var total = new Calculator().Add(2).Add(3).Multiply(5);
alert(total);

你可以用原型设计做一些有趣的事情:

var Calculator = function(){ /*...*/ }
// Works with alert
Calculator.prototype.toString = function(){
   return this.Result();
}
// Works with operators
Calculator.prototype.valueOf = function(){
   return this.Result();
}
var total = new Calculator().Add(2).Add(3).Multiply(5);
alert(total); // 25
total + 1; // 26

请注意,该函数alert(...)在使用 .toString() 显示之前将参数转换为字符串。这也适用于任何其他具有字符串的操作,例如串联(例如 total + "") .使用数字的操作改用.valueOf()

我认为返回.Result()是完全可以的,因为你不能让可链接的方法返回一种类型,然后最终自动神奇地变成其他类型。

甚至其他建议的答案也是使用将计算器转换为结果的方法,它们只是由运行时隐式调用(例如警报函数中的 toString)。

如果你想要真正的数字链,你应该扩展数字原型,而不是使用计算器(但我知道,猴子补丁是邪恶的)。