Ответ 1
это не может быть сделано так, как вы подразумеваете, это должно быть сделано (хотя это было бы мило). Лучший способ, с помощью которого я видел это, - реализовать на прототипе набор методов, которые будут действовать как сравнительные:
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.
Я думал об этой проблеме сегодня на работе, и есть альтернативный способ использовать стандартные операторы сравнения, но они имеют пользовательские сопоставления объектов. Хитрость заключалась бы в том, чтобы иметь свойство (геттер) на объекте, представляющем сопоставимое состояние. Это потребовало бы, чтобы все экземпляры объекта оценивались с одним и тем же числовым значением при одинаковых сопоставимых свойствах. В качестве примера рассмотрим векторы:
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;
}
теперь у вас есть все преимущества объекта с легкими численными сравнениями, и это даже немного коротко.