5

Tôi có lớp Rational này mà có một phương pháp cho từng hoạt động (thêm, mult vv)Enable một lớp Rational để xử lý khai thác toán

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 

Tôi có thể làm cho nó nhiều hơn "tự nhiên" ví dụ để bật console.log(a * b)?

+4

Javascript không hỗ trợ điều hành quá tải. Bạn có thể thay thế 'print()' bằng 'toString'. – georg

+0

Một số dạng eval và thay thế chuỗi sẽ hoạt động, chẳng hạn như: console.log (Chức năng ("a * b" .replace ("* b", ". Mult (b) .print()"))) Có là [một] (http://stackoverflow.com/a/1390694/1113772) hoặc [hai] (http://stackoverflow.com/questions/14147290/how-can-i-set-loop-imacros-by- javascript) các câu hỏi về macro có thể hữu ích. –

Trả lời

9

Bạn không thể khai thác quá tải (đọc similar questions). Ngoài ra, một phương pháp chuyên dụng như mult có thể được coi là một dấu hiệu của thiết kế tốt (không chỉ trong Javascript), vì thay đổi hành vi của hành vi ban đầu có thể gây nhầm lẫn cho người dùng (tốt, một số hợp lý thực sự là một ứng cử viên tốt cho quá tải)).

Bạn có thể thay đổi print thành toString khi người dùng thg435 đã đề xuất.

Đi xa hơn nữa:

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

này sẽ cho phép các a * b cú pháp (lưu ý: bạn không hoạt động trên Rationals nữa, nhưng thay vào nguyên thủy).

+0

Đó là những gì tôi nghĩ quá, tuy nhiên, nó hóa ra là sai: thử 'new Rational (1,3) .toString()'. – georg

+0

@ thg435 hoạt động tốt trong công cụ Firefox – emesx

+0

Không, nó không hoạt động. Nếu bạn định nghĩa valueOf, chuyển đổi chuỗi sẽ sử dụng nó và không phải là toString của bạn. Vì vậy, bạn nhận được '0.3333' thay vì' 1/3'. – georg

0

Là một ý tưởng, bạn có thể thử để viết một phân tích cú pháp cho mình, do đó bạn viết một số điều như thế này:

console.log(R("a * b")); 

đâu R là hàm chuyển đổi a * b để a.mult (b) và sau đó eval này.

3

Gần nhất bạn có thể nhận được là một số loại răng cưa điều hành, chẳng hạn như thế này:

/* 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] 

Tài liệu tham khảo

Các vấn đề liên quan