2011-02-23 6 views
8

저는 앱 전체에서 사용하는 일련의 자바 스크립트 클래스를 보유하고 있습니다. 한 가지 경우, 나는 내 클래스 중 하나와 일치하는 모양을 가진 Ajax 응답으로부터 json을 평가하려고한다.javascript : eval로 생성 된 객체 캐스팅

jquery parseJSON 메서드를 사용하여 나를위한 평가를 수행하고 있습니다.

유일한 문제는 클래스에 정의 된 메서드를 호출하려고하지만 메서드가 eval 된 개체에 존재하지 않는다는 것입니다.

내 새 개체에서이 방법을 사용할 수있는 가장 좋은 방법은 무엇입니까? 그것을 "캐스팅"할 수있는 방법이 있습니까?

+1

나는 꽤 오랫동안 이것을 궁금해했습니다. – Kayla

+0

[내 대답은] (http://stackoverflow.com/questions/5063558/javascript-overriden-method/5063837#5063837)을보십시오. 이를 사용하여 JSON에서 가져온 객체를 "클래스"의 프로토 타입으로 확장 할 수 있습니다. (또는 @ Box9가 잘 보여 주듯이 JSON의 데이터를 "클래스"의 객체로 복사하십시오.) –

답변

6

JavaScript에서는 캐스팅의 개념이 없습니다. 대신 클래스의 생성자를 수정하여 일반 객체를 허용 할 수 있습니다. 어떻게 당신이이 당신의 클래스를 설정 한 방법에 따라 달라집니다,하지만 단순히 클래스의 새 인스턴스로 개체의 단순 복사본을 포함 할 수있다 :

var MyClass = function (obj) { 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     this[i] = obj[i]; 
    } 
    // Other class initialisation code 
}; 

는 다음과 같은 개체를 "캐스팅"

var result = new MyClass(someObject); 

당신이 필요로 여러 클래스가있는 경우, 당신이 (당신이 jQuery를 사용하는 경우 나,이 기능이 이미 존재하는) 당신을 위해 복제를 않는 extend 기능을 작성하는 것이 좋습니다 :

var extend = function (obj1, obj2) { 
    for (var i in obj2) { 
     if (!obj2.hasOwnProperty(i)) continue; 
     obj1[i] = obj2[i]; 
    } 
}; 
,691을

그리고 나서 다음과 같이 "cast"하십시오 :

var result = new MyClass(); 
extend(result, someObject); 
+0

그렇지 않으면 객체 직렬화 및 직렬화 해제로 알려져 있습니다. – Raynos

+0

흥미 롭습니다 만,이 비트에 대해서는 잘 모르겠지만 "var result = new MyClass (someJson);" 분명히 "someJSON"중 하나가 생성자에서 eval'd 될 필요가 있거나 이미 "someObject"라고해야하는 경우 eval'd가 될 것입니다. –

+0

@ 레이 노스, 정말로. OP는'parseJSON'을 사용하여 이미 그것을 deserialised했습니다 - 그는 이것을 어떤 클래스의 인스턴스로 복사하는 방법이 필요합니다. –