2013-08-11 3 views
0

JSON 스키마에서 객체 생성자를 빌드하는 방법이 있습니까? 한 번 편집 할 수있는 응용 프로그램의 네임 스페이스와 관련된 json 스키마를 만들고 내 객체의 속성 (런타임 전)을 변경하려고합니다. 그것은 JSON에서 유사한 구조를 만들 수json 스키마의 생성자

난 당신이

var Note = function(input){ 
    var title = input 
}; 
var newNote = new Note("test title"); 

같은 의사 고전적인 객체 생성자를 쓸 수 있다는 사실을 알고 있습니까? 이러한 내가 쓸 수 :

var Note = { 
    "title":"" 
}; 
var newNote = new Note(); 
newNote.title = "test title" 

을 나는이 위의 구문이 잘못 이해하지만 내가 좋아하는 것으로, 예를 들어 있습니다

var notes = { 
    "NotesList":[{ 
    "title":"note1", 
    "content":"test content" 
    }] 
} 
var newNote = new Note(); 
notes.NotesList.add(newNote); 
newNote.title = "new title"; 
내 모든 객체를 기반으로 할 수 있도록

과의 모든 내 json 스키마에서 생성 된이 객체 템플릿의 자식. 이것이 가능하지 않다면 더 나은 방법을 추천 할 수 있습니까?

+0

JSON 스키마가 아니라 실제로 JSON이 아니며 자바 스크립트 코드 일뿐입니다. 따라서 따옴표는 필요하지 않습니다. '.add'를'.push'로 바꾼다면 코드는 그대로 실행됩니다. – Esailija

+0

세 번째 예제의 진정한 목적은 스키마 파일에서 json을 읽고 클래스를 생성하는 것입니다. – aclave1

+0

구문 분석 된 JSON을 직접 사용할 수없는 이유는 무엇입니까? 데이터가 있거나 목록 인 객체 뒤에 클래스를 가질 필요가 없습니다. – Esailija

답변

0

내가 찾고있는 것에 대한 답을 찾았습니다.

var myobj = {}; 

내가 지정하는 JSON을 사용하고 싶었 : 내 궁극적 인 목표는 어린이 등 객체가 같은 내 전체 응용 프로그램에 네임 스페이스로 사용되는있을 수 있습니다 각각의 아이들의 배열로 객체를 만드는 것이 었습니다 그들은 이러한 기본을 가질 수 있도록 내 새로운 객체로 복제 다음이에서 생성자 함수를 구축하고, 내가하고 결국 무엇

var myObj = { 
"name": "genericname", 
"id": "uniqueid", 
"children": [ 
    { 
     "grandchildren": [ 
      { 
       "name": "child", 
       "age": "0" 
      } 
     ] 
    } 
] 
}; 

했다 : 그 다음이 개체의 속성과 같은 이러한 속성 떨어져 생성자를 구축 다음과 같은 값 :

myObj.Child = function(){ 
    var child = myObj.children[0]; 
    return child; 
    //this is the unmodified constructor child 
}; 
var myObj.createChild = function(){ 
    var newChild = new Clone(myObj.Child()); 
    //do stuff to this is new child which can be modified without changing the original 
    return newChild; 
}; 
1

귀하의 질문을 완전히 이해하지 못했습니다. 그러나 함수를 JSON으로 변환하고 싶다면 분명 가능합니다.

당신이 할 필요가 JSON 형식으로 생성자의 abstract syntax tree를 생성하는 Mozilla Parser API를 사용 acorn 같은 자바 스크립트 파서를 사용합니다. 예 :

var ast = acorn.parse(Note); 
var json = JSON.stringify(ast, null, 4); 
alert(json); 

function Note(input) { 
    var title = input; 
} 

데모보기 here을 참조하십시오. 필요한 경우

{ 
    "type": "Program", 
    "start": 0, 
    "end": 47, 
    "body": [ 
     { 
      "type": "FunctionDeclaration", 
      "start": 0, 
      "end": 47, 
      "id": { 
       "type": "Identifier", 
       "start": 9, 
       "end": 13, 
       "name": "Note" 
      }, 
      "params": [ 
       { 
        "type": "Identifier", 
        "start": 14, 
        "end": 19, 
        "name": "input" 
       } 
      ], 
      "body": { 
       "type": "BlockStatement", 
       "start": 21, 
       "end": 47, 
       "body": [ 
        { 
         "type": "VariableDeclaration", 
         "start": 27, 
         "end": 44, 
         "declarations": [ 
          { 
           "type": "VariableDeclarator", 
           "start": 31, 
           "end": 44, 
           "id": { 
            "type": "Identifier", 
            "start": 31, 
            "end": 36, 
            "name": "title" 
           }, 
           "init": { 
            "type": "Identifier", 
            "start": 39, 
            "end": 44, 
            "name": "input" 
           } 
          } 
         ], 
         "kind": "var" 
        } 
       ] 
      } 
     } 
    ] 
} 

당신은 JSON 파일에 위의 AST를 저장하고로드 할 수 있습니다 : 위의 코드는 다음과 같은 출력을 생성합니다. 다음과 같이 자바 스크립트로 다시 AST를 변환 escodegen를 사용할 수 있습니다

alert(escodegen.generate(ast)); 

데모 here를 참조하십시오. 그런 다음 생성 된 코드 eval을 사용하고 원하는대로 Note 생성자를 사용할 수 있습니다.

관련 문제