5

I持っている各操作の方法(追加、MULTなど)は数学演算子

function Rational(nominator, denominator){ 
    this.nominator = nominator; 
    this.denominator = denominator || 1;  
} 

Rational.prototype = { 
    mult: function(that) { 
     return new Rational(
      this.nominator * that.nominator, 
      this.denominator * that.denominator 
      ); 
    }, 
    print: function() { 
     return this.nominator + '/' + this.denominator; 
    } 
}; 

var a = new Rational(1,2), 
    b = new Rational(3); 

console.log(a.mult(b).print()); // 3/2 

は私がすることはできますがあります。この合理的なクラスのそれより「自然」などを処理するために合理的なクラスを有効にしますconsole.log(a * b)を有効にしますか?

+4

Javascriptが演算子のオーバーロードをサポートしていません。あなたは 'print()'を 'toString'に置き換えることができます。 – georg

+0

console.log(ファンクション "a * b" .replace( "* b"、 "。mult(b).print()")))))))) [1](http://stackoverflow.com/a/1390694/1113772)または[2](http://stackoverflow.com/questions/14147290/how-can-i-set-loop-imacros-by- javascript)に役立つマクロに関する質問です。 –

答えて

9

演算子をオーバーロードすることはできません(similar questionsを読んでください)。

また、multのような専用の方法は、過負荷のために(ユーザが混乱することができるだけでなく、合理的な数実際に良好な候補をオペレータの動作を変更するため、良好なデザイン(だけでなく、JavaScriptで)の符号として扱うことができます)。

ユーザーthg435として、printtoStringに変更できます。

さらに行く:

Rational.prototype = { 
    mult : ... , 
    toString: ... , 
    valueOf: function() { return this.nominator/this.denominator; } 
}; 

を、これは(注意:あなたは、それ以上Rationalsで動作するのではなく、プリミティブではありません)a * b構文を可能にします。その後、

Rはa.multする* bを変換する関数である
console.log(R("a * b")); 

(B)と:アイデアとして、あなたはこのようにいくつかのことを書くように、パーサを自分で書いてみることができます

+0

それは私が思ったことですが、それは間違っていることが判明しました。新しいRational(1,3).toString()を試してみてください。 – georg

+0

@ thg435はFirefoxエンジンで正常に動作します – emesx

+0

いいえ、そうではありません。 valueOfを定義すると、文字列の変換ではtoStringは使用されません。だから、あなたは '1/3'の代わりに' 0.3333'を得ます。 – georg

3

あなたが得ることができる最も近いこのような、オペレータエイリアシングのいくつかの並べ替えです:

/* Accepts a symbolic or string operator, returns a function which accepts numbers */ 
function operator(node) 
    { 
    //Mapping between string and symbol operators 
    var map = {"mod": "%", "mult": "*", "div": "/", "plus": "+", "minus": "-"} 

    //Return a function which applies the string or symbol operator to two numbers 
    return Function("x,y", "return x" + (map[node] || node) + "y"); 
    } 

// pass "*" to operator; pass 5,7 to returned function 
var foo = operator("*")(5,7); 

// pass "plus" to operator; pass 3,2 to returned function 
var bar = operator("plus")(3,2); 

// pass "mod" to operator; pass 1,0 to returned function 
var baz = operator("mod")(1,0); 

console.log(["foo",foo,"bar",bar,"baz",baz]); //["foo", 35, "bar", 5, "baz", NaN] 

参照