2011-04-11 2 views
7

저는 사용자 정의 자바 스크립트 클래스 (John Resig's Simple Javascript Inheritance을 사용하여 생성)가 있습니다. ==, <, >, >=<= 기호를 사용하여이 클래스의 두 인스턴스를 비교할 수 있기를 원합니다.JavaScript에서 비교 연산자의 기본 동작을 무시합니다.

내 사용자 정의 클래스의 비교자를 재정의하려면 어떻게합니까?

+0

자바 스크립트에서'='는 비교 연산자가 아니며 대입 연산자입니다. –

+0

죄송합니다. 그것을 잡아 주셔서 감사합니다. – Chetan

+1

기사 하단을 확인하십시오 : * "이 주제는 진행중인 저서 : JavaScript 닌자의 비밀, 2008 년 가을에 공개 될 예정입니다."* - 여전히 발표되지 않은 Resig의 저서는 Duke Nukem Forever of JavaScript':)' –

답변

3

이 작업을 수행해야 함을 의미하는 방식으로 수행 할 수는 없습니다 (그러나 단정 할 수도 있음). 나는이 작업이 완료 본 가장 좋은 방법은 비교급처럼 행동 프로토 타입에 메소드 세트를 구현하는 것입니다 :

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. 

을 나는 직장에서 somemore 오늘이 문제에 대해 생각하고 활용하는 다른 방법이 표준 비교 연산자이지만 사용자 정의 객체 비교가 있습니다. 트릭은 비교 가능한 상태를 나타내는 객체에 속성 (getter)을 갖는 것입니다. 이렇게하려면 객체의 모든 인스턴스가 동일한 비교 가능한 속성을 가진 동일한 숫자 값으로 평가되어야합니다. 당신이 가치의 단순한 숫자 식으로 분류 할 수있는 개체를 처리하는 경우 물론

var v1 = new Vector(1,1,1); 
var v2 = new Vector(1,0,1); 
v1.comp() > v2.comp() // true 

이 유일한 작품 : 당신은 벡터를 설정할 때 다음

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

: 예를 들어 이제 벡터를 이야기하자 ,하지만 위쪽면은 기본 효과를 얻기위한 구현 코드가 매우 낮으며 객체 자체가 구성 요소의 수식을 반환하는 함수로 만들기까지 갈 수 있다는 것입니다.

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

이제는 쉽게 숫자 비교가 가능한 개체의 모든 이점을 누릴 수 있으며 좀 간결합니다.

+0

나는 많은 것으로 의심된다. ​​/ 어쨌든. – Chetan

+0

얼마 전에 Javascript에서 연산자 오버로딩을위한 해킹 방법을 보았습니다 : http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx 난 항상 그것을 밖으로 시도하고 내가 그것을 향상시킬 수 있는지보고 싶었지만, 나는 그것에 대해 전혀 모르 잖아. –

+0

@PeterOlson 링크가 더 이상 작동하지 않습니다. 나는 당신이 그것을 재검토하겠다는 것을 알게된다면 그것을 읽고 싶습니다. 감사. – Gabriel

8

valueOf()를 재정의하십시오. 그럼 당신은 다음과 같이 물건을 작성할 수 있습니다

if (obj1.valueOf() === obj2.valueOf()) 
if (obj1.valueOf() < obj2.valueOf()) 
if (obj1.valueOf() > obj2.valueOf()) 

을 그래서 난 그냥 프로토 타입에 따라 valueOf 추가 비교를 무시하는 특별한 자바 스크립트 객체 유형을 필요할 때마다. valueOf는 값을 반환하기 때문에 기본 유형에도 잘 작동합니다.

null을주의하십시오.

+2

valueOf의 좋은 점은 명시 적으로 호출 할 필요가 없다는 것입니다. obj1> obj2가 valueOf를 호출합니다. 배열을 정렬 할 때 toString이 (FF로) 호출되기도하므로이를 구현하십시오. – HMR

3

Lee가 올바른지, valueOf를 구현 한 다음 (예 : === 또는! ===가 아닌) 객체를 비교할 때 이것이 사용되지만 일부를 정렬 할 때 사용되기 때문에 toString도 사용해야합니다. 이유.

function Test(value){ 
    this.value=value; 
} 
Test.prototype.toString=function(){ 
    console.log("tostring called"); 
    // could do something with case sensitiveness here 
    return new String(this.valueOf()); 
} 
Test.prototype.valueOf=function(){ 
    console.log("valueof called"); 
    return this.value; 
} 

var t1=new Test(11); 
var t2=new Test(1.1); 
var arr=[t1,t2]; 
console.log(arr.sort()); 
console.log(t1>=t2); 
관련 문제