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

Is this the right way to implement chaining in javascript?

在网上阅读后,我编写了这个简单的代码,通过链接进行加法和乘法。但是阅读代码,在我看来,方法 "Result" 使代码的可读性降低,并且看起来有点多余。谁能帮我去掉 Result 函数?

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()

我认为 returning .Result() 非常好,因为您不能将可链接方法 return 设置为一种类型,然后最后自动神奇地变成其他类型。

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

如果你想要真正的数字链接,你应该扩展 Number 原型而不是使用计算器(但我知道,Monkey-patching 是邪恶的)。