2012-03-06 2 views
3

마지막으로 수행 한 작업은 이전에 JSON을 사용하여 저장 한 객체를 완전히 복구하는 것입니다. 현재 JSON은 데이터 만 복구 할 수 있지만 동작은 허용하지 않습니다. 해결책은 새로운 객체를 생성하고 (obj라고 부름) JSON에서 복구 한 객체의 데이터를 obj로 복사하는 것입니다. 그러나 그것은 나에게 좋지 않다. JavaScript에서 객체 프로토 타입을 동적으로 변경하는 방법이 있습니까?JavaScript 객체의 프로토 타입을 동적으로 변경합니다.

은 내가 (자체 제작 복사 방법을 사용하여) 순간에 문제를 해결하는 방법은 다음과 같습니다

(this code on JSFiddle)

function Obj() { 
    this.D = "D"; 
    this.E = "E"; 
    this.F = "F"; 

    this.toString = function() { 
     return this.D + " * " + this.E + " * " + this.F; 
    }; 

    this.copy = function (anotherObj) { 
     for (var property in anotherObj) { 
      if (isDef(anotherObj[property]) && isDef(this[property])) { 
       this[property] = anotherObj[property]; 
      } 
     } 
    } 
} 
; 

$(document).ready(function() { 
    var str = $.toJSON(new Obj()); 
    $("#result").append("<p>JSON: " + str + "</p>"); 
    var obj = new Obj(); 
    obj.copy($.parseJSON(str)); 
    $("#result").append("<p>Recovered obj: " + obj.toString() + "</p>"); 
}); 

function isDef(variable) 
{ 
    return typeof variable !== undefined; 
} 

답변

4

많은 인기 JS 라이브러리가 제공하는 쉬운 방법이 있습니다. 당신이 jQuery를 사용하는 경우

예를 들어, 다음처럼 복사 기능을 대신 jQuery.extend() 방법을 사용할 수 있습니다 :

var obj = $.extend(new Obj(), $.parseJSON(str)); 

포크 드 jsFiddle here을.

편집 :this question에서 아이디어를 바탕으로, 나는 updated jsFiddle을 볼뿐만 아니라 모든 중첩 된 기능을 가지고 복원 된 개체를 얻을 수있었습니다.

function Obj2() { 
    this.A = "A"; 
} 
Obj2.prototype.toString = function() { 
    return this.A; 
}; 

function Obj() { 
    this.A = new Obj2(); 
    this.D = "D"; 
    this.E = "E"; 
    this.F = "F"; 
} 
Obj.prototype.toString = function() { 
    return this.A.toString() + " * " + this.D + " * " + this.E + " * " + this.F; 
}; 

var str = $.toJSON(new Obj()); 
$("#result").append("<p>JSON: " + str + "</p>"); 
var obj = jQuery.extend($.parseJSON(str), new Obj()); 
$("#result").append("<p>Recovered obj: " + obj.toString() + "</p>"); 
+0

감사 :

핵심 아이디어는 확실히 (단지 데이터이다) JSON에서 복원 객체가 첫번째 매개 변수 $.extend()하는 대신 속성의 프로토 타입을 사용하고 확인하는 것입니다. 그것은 내가 찾고 있었던 것이다. 그것은 개체 필드가있는 경우 작동하지 않는 것이 유감 : http://jsfiddle.net/mr_goodcat/KfQrc/2/ –

+0

업데이트 : "깊은 사본"해결책이어야하지만, 나는 그것을 작동하게 할 수없는 것 같습니다 행동 부분 (데이터 복구) : http://jsfiddle.net/mr_goodcat/KfQrc/3/ –

+0

그래, 나도 그 일을 할 수 없었어. 중첩 된 프로토 타입 복사는 까다 롭습니다. – GregL

관련 문제