有没有办法从JSON模式构建对象构造函数?我想创建一个与我的应用程序命名空间相关联的json模式,我可以编辑一次,并更改我的对象的属性(在运行之前)。
我知道你可以编写像
这样的伪经典对象构造函数var Note = function(input){
var title = input
};
var newNote = new Note("test title");
是否可以从json创建类似的结构?这样我就可以写:
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 :(得分:1)
我不确定我完全理解你的问题。但是,如果你想将一个函数转换为JSON,那么肯定是可能的。
您需要做的就是使用像acorn这样的JavaScript解析器,它使用Mozilla Parser API生成JSON格式的abstract syntax tree构造函数。例如:
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"
}
]
}
}
]
}
您可以将上述AST保存在JSON文件中,并在需要时加载它。您可以使用escodegen将AST转换回JavaScript,如下所示:
alert(escodegen.generate(ast));
参见演示here。然后,您可以eval
生成的代码,并根据需要使用Note
构造函数。
答案 1 :(得分: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;
};