Как вы можете определить, как объекты сравниваются в JavaScript - PullRequest
7 голосов
/ 14 января 2009

Я хочу определить класс JavaScript, Foo.

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

Я создам "экземпляры" моего Foo:

foo1 = new Foo(1);
foo2 = new Foo(1);

и я хочу, чтобы мои экземпляры Foo были сравнимы друг с другом с помощью стандартного оператора == равенства:

foo1 == foo2;      // this should be true

Я не могу найти способ сделать это. Я думал, что что-то с функцией valueOf(), но это полезно только тогда, когда одна сторона сравнения является примитивом, а не так, как указано выше, где обе имеют тип объекта.

Пропустил ли я что-то действительно простое, похожее на Ruby's

def ==(obj); end

Ответы [ 4 ]

6 голосов
/ 14 января 2009

В JavaScript нет перегрузки операторов. См. это обсуждение , охватывающее ваш вопрос.

4 голосов
/ 14 января 2009

не в чистом виде ...

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

Переопределить функцию toString вашего собственного объекта:

Foo.prototype.toString = function( ){ return this.value.toString(); }

Создание двух тестовых объектов:

foo1 = new Foo(1);
foo2 = new Foo(1);

Если значения ваших объектов - строки или числа, вы можете использовать движок javascript для преобразования ваших объектов в строку, добавив их в пустую строку:

alert( ""+foo1 === ""+foo2 ); //Works for strings and numbers

То же самое, но чище:

alert( foo1.toString() === foo2.toString() ); //Works for strings and numbers

Если значения ваших объектов только числовые, вы можете использовать унарный оператор + для преобразования объекта в число:

alert( +foo1 === +foo2 ); //Works for numbers

Тем не менее, я рекомендую вам определить toString, как указано выше, а также равно:

Foo.prototype.equals=function(b){return this.toString() === b.toString();}

А потом назовите это так:

alert ( foo1.equals(foo2) );

Поскольку вы теперь определили toString, вы можете:

alert(foo1); // Alerts the value of foo1 instead of "[Object object]"
alert("foo1: " + foo1); // Alerts "foo1: 1". Useful when debugging. 
1 голос
/ 14 января 2009

Я не думаю, что это возможно с помощью JavaScript. Вы должны написать свою собственную функцию, например isEqual()

0 голосов
/ 14 января 2009

JavaScript в этом отношении похож на одноименный Java: оператор не перегружен. Вместо этого используйте пользовательский метод, например equals().

...