Como você pode definir como os objetos são comparados em JavaScript
-
22-07-2019 - |
Pergunta
Eu quero definir uma classe JavaScript, Foo.
Foo = function(value){
this.value = value;
};
Vou criar "instâncias" do meu Foo:
foo1 = new Foo(1);
foo2 = new Foo(1);
e eu quero que minhas instâncias de Foo ser comparáveis ??entre si usando o == operador de igualdade padrão:
foo1 == foo2; // this should be true
Não consigo encontrar uma maneira de fazer isso. Eu pensei que eu era sobre a algo com a função valueOf()
, mas isso só é útil quando um lado da comparação é um primitivo, não como acima de onde ambos são do tipo de objeto.
eu perdi alguma coisa realmente simples semelhante a de Ruby
def ==(obj); end
Solução
JavaScript não tem sobrecarga de operadores. Consulte esta discussão cobrindo sua pergunta.
Outras dicas
Não de uma forma limpa ...
Foo = function (value){
this.value = value;
};
Substituir a função toString de seu próprio objeto:
Foo.prototype.toString = function( ){ return this.value.toString(); }
A criação de dois objetos de teste:
foo1 = new Foo(1);
foo2 = new Foo(1);
Se os valores de seus objetos é strings ou números, você pode ter o motor de javascript para converter seus objetos em uma seqüência, adicionando-os para uma cadeia vazia:
alert( ""+foo1 === ""+foo2 ); //Works for strings and numbers
A mesma coisa mas de pó:
alert( foo1.toString() === foo2.toString() ); //Works for strings and numbers
Se os valores de seus objetos só é numérico, você pode usar o operador + unário para converter o objeto para um número:
alert( +foo1 === +foo2 ); //Works for numbers
No entanto, eu recomendo que você tanto definir o toString como acima e também um igual:
Foo.prototype.equals=function(b){return this.toString() === b.toString();}
E, em seguida, chamá-lo assim:
alert ( foo1.equals(foo2) );
Como você já tenha definido toString você pode:
alert(foo1); // Alerts the value of foo1 instead of "[Object object]"
alert("foo1: " + foo1); // Alerts "foo1: 1". Useful when debugging.
Eu não acho que isso é possível usando javascript. Você tem que escrever sua própria função, por exemplo, isEqual()
O JavaScript é a este respeito como seu homónimo Java: Sem sobrecarga de operadores. Usar um método personalizado como equals()
vez.