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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top