Как вы можете определить, как объекты сравниваются в JavaScript
-
22-07-2019 - |
Вопрос
Я хочу определить класс 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
Решение
В JavaScript нет перегрузки операторов. См. это обсуждение , посвященное вашему вопросу.
Другие советы
Не в чистом виде ...
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.
Я не думаю, что это возможно с помощью JavaScript. Вы должны написать свою собственную функцию, например <Код> IsEqual () код> р>
В этом отношении JavaScript похож на одноименный Java: оператор не перегружен. Вместо этого используйте пользовательский метод, такой как equals ()
.