2012-04-26 11 views
16

Mam niestandardową klasę, która ma kilku członków. Muszę porównać je ze sobą. javascript pozwala mi pisać:Jak wykonać mniej niż/więcej niż porównania na obiektach niestandardowych w javascript

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

, ale nie rozumiem zachowania logicznego porównania. Czy ktoś może wyjaśnić semantykę porównania < w powyższym kodzie? Czy istnieje sposób kontrolowania tego, co się dzieje, aby uzyskać właściwe zachowanie? Wiem, że mogę napisać metodę porównania dla klasy, ale ponieważ javascript pozwala mi ją pisać, zastanawiałem się, co ona myśli.

Dzięki.

Odpowiedz

24

Trzeba zdefiniować .valueOf metodę, która zwraca prymitywne, które mogą być wykorzystane do porównania:

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 

Jeśli nie definiują, tym ciąg "[object Object]" jest używany do porównania:

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

Wow to jak interfejs IComparable dla JavaScript. –

+1

@Jay przy porównywaniu obiektów dla równości ('==', '==='), zawsze będzie porównywać odniesienia (czy 2 operandy wskazują ten sam dokładny obiekt w pamięci). Musisz zdefiniować metodę taką jak '.isEqual' i nazwać ją normalnie' a.isEqual (b) ' – Esailija

+0

Dzięki. To idealne. Bummer, że nie robi to ani == ani === pracy. Dziwne, że nie mogłem znaleźć tego rozwiązania w Internecie. – drdwilcox

Powiązane problemy