2012-04-26 26 views
16

Tôi có một lớp tùy chỉnh có một số thành viên. Tôi cần phải so sánh chúng với nhau. javascript cho phép tôi viết:Cách thực hiện ít hơn/lớn hơn so sánh về các đối tượng tùy chỉnh trong javascript

var a = new MyType(1); 
var b = new MyType(2); 
if (a < b) { ... 

nhưng tôi không hiểu hành vi của so sánh lôgic. Ai đó có thể giải thích ngữ nghĩa của sự so sánh < trong đoạn mã trên không? Có cách nào để kiểm soát những gì xảy ra để tôi có thể có hành vi đúng không? Tôi biết tôi có thể viết một phương pháp so sánh cho lớp học, nhưng kể từ khi javascript cho phép tôi viết nó, tôi tự hỏi những gì nó nghĩ rằng nó đã làm.

Cảm ơn.

Trả lời

24

Bạn cần phải xác định một phương pháp .valueOf trả về một nguyên thủy có thể được sử dụng để so sánh:

function MyType(value){ 
    this.value = value; 
} 

MyType.prototype.valueOf = function() { 
    return this.value; 
}; 

var a = new MyType(3), 
    b = new MyType(5); 

a < b 
true 
a > b 
false 
a >= b 
false 
b < a 
false 
b > a 
true 

Nếu bạn không xác định nó, chuỗi "[object Object]" được sử dụng để so sánh:

"[object Object]" < "[object Object]" 
false 
"[object Object]" > "[object Object]" 
false 
"[object Object]" >= "[object Object]" 
true 
"[object Object]" <= "[object Object]" 
true 
+0

Điều đó giống như giao diện IComparable cho JavaScript. –

+1

@Jay khi so sánh các đối tượng cho sự bình đẳng ('==', '==='), nó sẽ luôn so sánh các tham chiếu (cho dù 2 toán hạng trỏ đến cùng một đối tượng chính xác trong bộ nhớ). Bạn cần phải định nghĩa phương thức như '.isEqual' và gọi nó là bình thường' a.isEqual (b) ' – Esailija

+0

Cảm ơn. Đó là hoàn hảo. Mặc dù vậy, nó không tạo ra tác phẩm == hoặc ===. Lạ thật là tôi không thể tìm thấy giải pháp này ở bất cứ đâu trên mạng. – drdwilcox

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