【问题标题】:Is this the right way to implement chaining in javascript?这是在javascript中实现链接的正确方法吗?
【发布时间】:2015-01-02 01:00:14
【问题描述】:

在网上阅读后,我编写了这个简单的代码,通过链接进行加法和乘法运算。但是阅读代码,在我看来,“结果”方法使代码的可读性降低,而且有点多余。有人可以帮我摆脱 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);

【问题讨论】:

  • 嗯,total 并不是真正的总数,是吗?这是一个Calculator 对象。
  • 您的问题与这个问题非常相似:How to achieve arbitrary chain on function call in javascript? 寻找 mintsauce 和 Friedi 的答案。
  • 你为什么不把.Result()放在最后呢? (无关说明:有一个非正式的 JS 标准,非构造方法名称以小写字母开头。)

标签: javascript method-chaining


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多