Comment définir comment les objets sont comparés en JavaScript
-
22-07-2019 - |
Question
Je veux définir une classe JavaScript, Foo.
Foo = function(value){
this.value = value;
};
Je créerai des "instances". de mon foo:
foo1 = new Foo(1);
foo2 = new Foo(1);
et je veux que mes instances de Foo soient comparables les unes aux autres en utilisant l'opérateur standard == d'égalité:
foo1 == foo2; // this should be true
Je ne peux pas trouver un moyen de le faire. Je pensais utiliser quelque chose avec la fonction valueOf ()
, mais cela n'est utile que lorsqu'un côté de la comparaison est une primitive, et non comme ci-dessus, où les deux sont de type objet.
Ai-je oublié quelque chose de très simple qui ressemble à Ruby
def ==(obj); end
La solution
JavaScript n'a pas de surcharge d'opérateur. Consultez cette discussion pour répondre à votre question.
Autres conseils
Pas de façon propre ...
Foo = function (value){
this.value = value;
};
Remplacez la fonction toString de votre propre objet:
Foo.prototype.toString = function( ){ return this.value.toString(); }
Création de deux objets de test:
foo1 = new Foo(1);
foo2 = new Foo(1);
Si les valeurs de vos objets sont des chaînes ou des nombres, vous pouvez avoir le moteur JavaScript pour convertir vos objets en chaîne en les ajoutant à une chaîne vide:
alert( ""+foo1 === ""+foo2 ); //Works for strings and numbers
Même chose mais plus propre:
alert( foo1.toString() === foo2.toString() ); //Works for strings and numbers
Si les valeurs de vos objets sont uniquement numériques, vous pouvez utiliser l'opérateur unaire + pour convertir l'objet en un nombre:
alert( +foo1 === +foo2 ); //Works for numbers
Cependant, je vous recommande de définir à la fois le toString comme ci-dessus et un égal:
Foo.prototype.equals=function(b){return this.toString() === b.toString();}
Et appelez ça comme ça:
alert ( foo1.equals(foo2) );
Depuis que vous avez défini toString, vous pouvez:
alert(foo1); // Alerts the value of foo1 instead of "[Object object]"
alert("foo1: " + foo1); // Alerts "foo1: 1". Useful when debugging.
Je ne pense pas que ce soit possible en utilisant javascript. Vous devez écrire votre propre fonction, par exemple. isEqual ()
JavaScript est à cet égard comme son homonyme Java: Pas de surcharge de l'opérateur. Utilisez une méthode personnalisée telle que equals ()
à la place.