0

有没有办法从 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 模式创建的对象模板。如果这是不可能的,你能推荐一个更好的方法吗?

4

2 回答 2

1

我不确定我是否完全理解了你的问题。但是,如果您希望将函数转换为 JSON,那么是的,这绝对是可能的。

您需要做的就是使用像acorn这样的 JavaScript 解析器,它使用Mozilla Parser API以 JSON 格式生成构造函数的抽象语法树。例如:

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

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

在此处查看演示。上面的代码产生以下输出:

{
    "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));

在此处查看演示。然后,您可以eval根据需要生成生成的代码并使用Note构造函数。

于 2013-08-12T03:10:50.637 回答
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;
};
于 2013-08-12T00:58:53.673 回答