2014-01-10 1 views
0

문자열과 같은 개체를 저장하려고 시도했습니다.이 경우 JSON.stringify()을 사용하지만 공용 필드 만 선택합니다.자바 스크립트 : 개인 필드가있는 객체를 파일에 저장하는 방법은 무엇입니까?

비공개를 잡는 방법? { "prop2": 2}

<html> 
<head> 
    <title></title> 
</head> 
<body> 

    <script> 
     function Class1() { 
      var prop1 = 1; 
      this.prop2 = 2; 
     }; 

     var inst1 = new Class1(); 

     var str = JSON.stringify(inst1); 

     console.log(str); 
    </script> 
</body> 
</html> 

출력은

나는 { "prop1": 1, "prop2": 2} 원하는

+0

비공개 인 경우 클래스 컨텍스트 외부에서 액세스 할 수 없어야합니다. 맞습니까? – DontVoteMeDown

+0

@DontVoteMeDown 사실이지만 전체 개체 데이터를 저장하는 방법이 여전히 필요합니다 – 31415926

+1

이 경우이 개인 속성을 가져 오는 공용 메서드를 만든 다음 해당 개인 값이 채워진 공용 속성을 사용하여 새 개체를 만들어야합니다. . – DontVoteMeDown

답변

1

은 "개인 재산이"실제로되지 않습니다 객체 내부에서 발견되면 생성자 범위에서만 변수입니다. 메소드를 통해 상호 작용하면 클로저를 통해 해당 메소드에 사용할 수 있습니다.

개인 속성을 사용하여 개체를 serialize하려면 위에서 설명한대로 개인 속성 (클로저를 통해)에 액세스 할 수있는 고유 한 serialization 및 deserialization 메서드를 작성해야합니다.

일부 코드를 사용하면 시작하려면 :

function Class1(opt_prop1, opt_prop2) { 
    var prop1 = opt_prop1 || 1; 
    this.prop2 = opt_prop2 || 2; 

    this.toJSON = function() { 
    return { prop1 : prop1, prop2 : this.prop2 }; 
    }; 
} 

Class1.fromJSON = function(str) { 
    var obj = JSON.parse(str); 
    return new Class1(obj.prop1, obj.prop2); 
} 

참고 그 fromJSON 방법은 난 그냥 추가하여 기존의 OOP의 의미에서 Class1 클래스에 "고정"할 일이 정상적인 기능을 (할 수 있지만 생성자에 대해), toJSON 메서드는 생성자의 로컬 변수에 액세스해야하므로 생성자 내부에서 정의해야합니다.

@ JamesHill이 주석에서 언급했듯이 현재있는 경우 toJSON 메서드는 직렬화 구현을 단순화 할 수 있습니다. 직렬화하려는 속성이 들어있는 일반 객체를 반환하기 만하면됩니다.이 객체는 비 직렬화 프로세스에서 인스턴스를 복원 할 수있는 속성이어야합니다.

+1

클래스에서'this.serialize'를 정의하는 대신'this.toJSON()'을 정의하여 직렬화하려는 객체를 반환 할 수 있습니다. 이렇게하면 JSON.stringify가 먼저 객체에 대해 'toJSON' 메소드를 찾고, 객체의 표현을 가져 오는 데 사용합니다 (Java에서 toString을 오버라이드하는 것과 비슷합니다) –