Это правильный способ реализовать цепочку в javascript?

После прочтения в Интернете я написал этот простой код, который выполняет сложение и умножение с помощью цепочки. Но, читая код, мне кажется, что метод «Результат» делает код менее читаемым и кажется избыточным. Может ли кто-нибудь помочь мне избавиться от функции результата?

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

person developer747    schedule 02.01.2015    source источник
comment
Ну, total на самом деле не сумма, не так ли? Это Calculator объект.   -  person Robert Harvey    schedule 02.01.2015
comment
Ваш вопрос очень похож на этот: Как достичь произвольная цепочка вызовов функций в javascript? Ищите ответы mintsauce и friedi.   -  person Qantas 94 Heavy    schedule 02.01.2015
comment
Почему бы вам просто не поставить цепочку .Result() в конце? (Примечание, не связанное с этим: существует неофициальный стандарт JS, согласно которому имена методов, не являющихся конструкторами, начинаются со строчной буквы.)   -  person nnnnnn    schedule 02.01.2015


Ответы (2)


С прототипированием можно сделать кое-что интересное:

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

person JCOC611    schedule 02.01.2015

Я думаю, что возвращение .Result() совершенно нормально, так как вы не можете заставить цепные методы возвращать один тип, а затем, в конце концов, автоматически превращаться во что-то другое.

Даже другие предлагаемые ответы используют методы для превращения вашего калькулятора в результат, они просто неявно вызываются средой выполнения (например, toString в функции оповещения).

Если вам нужна настоящая цепочка чисел, вы должны расширить прототип Number и не использовать калькулятор (но я знаю, что Monkey-patch — это зло).

person Faris Zacina    schedule 02.01.2015