我有一个自定义的
Javascript类(使用
John Resig’s Simple Javascript Inheritance创建).我希望能够使用==,<,>,> =和< =符号来比较此类的两个实例. 如何覆盖自定义类的比较器?
解决方法
这不能以你暗示它应该被完成的方式来完成(虽然那会很好).我看到这样做的最好方法是在原型上实现一组方法,就像比较一样:
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,1); v1.comp() > v2.comp() // true
这当然只能处理可以分解为简单数值表达式的对象,但好处是获得基本效果的实现代码非常低,你甚至可以做到这一点.对象本身是一个函数,它返回它的组成部分的数字表达式.
function Vector(x,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; }
现在,您可以通过简单的数字比较获得对象的所有好处,甚至有点简洁.