8

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 のものに似た本当に単純なものを見逃していませんか?

def ==(obj); end
4

4 に答える 4

7

JavaScript には演算子のオーバーロードがありません。あなたの質問をカバーするこのディスカッションを参照してください。

于 2009-01-13T22:44:29.067 に答える
4

きれいな方法ではありません...

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

独自のオブジェクトの toString 関数をオーバーライドします。

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

2 つのテスト オブジェクトの作成:

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 を上記のように定義することと、equals の両方を定義することをお勧めします。

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. 
于 2009-01-13T23:57:28.653 に答える
1

これは JavaScript を使用して行うことはできないと思います。たとえば、独自の関数を作成する必要がありますisEqual()

于 2009-01-13T22:42:12.130 に答える
1

この点で、JavaScript はその名前の由来である Java に似ています: 演算子のオーバーロードはありません。equals()代わりにカスタムメソッドを使用してください。

于 2009-01-13T22:43:43.453 に答える