2015-01-02 3 views
1

После прочтения онлайн я написал этот простой код, который дополняет и умножает посредством цепочки. Но, читая код, мне кажется, что метод «Результат» делает код менее удобочитаемым, а вид кажется излишним. Может ли кто-нибудь помочь мне избавиться от функции Result?Это правильный способ реализации цепочки в 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); 
+1

Ну, 'total' на самом деле не сумма, не так ли? Это объект «Калькулятор». –

+0

Ваш вопрос очень похож на этот: [Как добиться произвольной цепочки при вызове функции в javascript?] (Http://stackoverflow.com/questions/26656718/how-to-achieve-arbitrary-chain-on-function- call-in-javascript) Ищите ответы на mintsauce и friedi. –

+0

Почему вы просто не цепляете '.Result()' в конце? (Несвязанное примечание: существует неофициальный стандарт JS, что имена неконструкторских методов начинаются с буквы в нижнем регистре.) – nnnnnn

ответ

6

Вы могли бы сделать некоторые интересные вещи с прототипирования:

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() вместо этого.

1

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

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

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