重写JavaScript中比较运算符的默认行为

重写JavaScript中比较运算符的默认行为,javascript,class,inheritance,object,overriding,Javascript,Class,Inheritance,Object,Overriding,我有一个自定义Javascript类(使用创建)。我希望能够使用==,,=,=,和来比较这个类的两个实例。这不能以您暗示应该这样做的方式来完成(尽管这样做很好)。我所看到的最好的方法是在原型上实现一组类似于比较的方法: gte : function( obj ){ // greater than or equal // return custom comparison with this as the object comparable on the left }, gt : functio

我有一个自定义Javascript类(使用创建)。我希望能够使用
==
=
=
,和
来比较这个类的两个实例。这不能以您暗示应该这样做的方式来完成(尽管这样做很好)。我所看到的最好的方法是在原型上实现一组类似于比较的方法:

gte : function( obj ){ // greater than or equal
  // return custom comparison with this as the object comparable on the left
},
gt : function( obj ){...}, // greater than but not equal
eq : function( obj ){...}, // equal to
// etc.
我在今天的工作中进一步思考了这个问题,有一种替代方法可以利用标准比较运算符,但可以进行自定义对象比较。诀窍是在表示可比较状态的对象上有一个属性(getter)。这将要求对象的所有实例在给定相同可比较属性的情况下计算为相同的数值。作为一个例子,让我们谈谈向量:

function Vector(x,y,z){
  this.comp = function(){
    // assuming these are floats you may wish to create a comparable level of
    // precision. But this gets the point across.
    return x + (y * 10) + (z * 100);
  }
}
然后,在设置向量时:

var v1 = new Vector(1,1,1);
var v2 = new Vector(1,0,1);
v1.comp() > v2.comp() // true
当然,这只适用于处理可以分解为简单数值表达式的对象,但好处是获得基本效果的实现代码非常低,甚至可以使对象本身成为返回其组成部分数值表达式的函数

function Vector(x,y,z){
  var v = function v(){
    return v.x + (v.y * 10) + (v.z * 100);
  }
  v.x = x;
  v.y = y;
  v.z = z;
  return v;
}
现在,通过简单的数字比较,您可以享受对象的所有好处,而且它甚至有点简洁。

尝试覆盖。然后你可以写这样的东西:

if (obj1.valueOf() === obj2.valueOf())
if (obj1.valueOf() < obj2.valueOf())
if (obj1.valueOf() > obj2.valueOf())
if(obj1.valueOf()==obj2.valueOf())
如果(obj1.valueOf()obj2.valueOf())
因此,每当我需要一个特殊的JavaScript对象类型来覆盖比较时,我只需将valueOf添加到原型中。它也适用于基本类型,因为valueOf只返回值


请注意空值。

Lee是正确的,如果您实现了valueOf,那么在比较对象时(而不是使用===或!==)将使用它,但您也必须使用toString,因为出于某种原因在排序数组时使用它

功能测试(值){
这个。值=值;
}
Test.prototype.toString=function(){
log(“调用tostring”);
//可以在这里做一些区分大小写的事情
返回新字符串(this.valueOf());
}
Test.prototype.valueOf=函数(){
console.log(“valueof被调用”);
返回此.value;
}
var t1=新试验(11);
var t2=新试验(1.1);
var-arr=[t1,t2];
log('sorted',arr.sort().map(o=>o.value));

console.log('较大',t1>=t2)
在Javascript中,
=
不是一个比较器,它是赋值运算符。感谢您的关注。请查看文章的底部:“这个话题将在我正在进行的工作中的书中深入讨论:JavaScript忍者的秘密。将于2008年秋季发行。”-雷斯格的书仍然没有发行,它是JavaScript的杜克核弹永远
:)
比较如何?标准是什么?可能与我所怀疑的相同:/谢谢。不久前,我看到了一种在Javascript中实现运算符重载的黑客方法:我一直想尝试一下,看看是否可以改进它,但我一直没有找到办法。@Petrolson该链接不再有效。我想读一读,如果你发现它,你会转贴吗?谢谢。@Gabriel有点像现在消失的那个。valueOf的好处是,您不需要显式地将其命名为obj1>obj2将为您调用valueOf。在对数组进行排序时,有时会调用toString(在FF上),因此也要实现它。