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(); }

创建两个测试对象:

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. 
于 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 回答