0

我有 javascript 对象树。让我们称之为“家庭”。它可以包含任意数量的某些对象(“父母”),每个对象可以包含任意数量的“子”对象。这个结构中的层数是已知的,树的每一层只包含一种特定的类型。

所有的对象都有数据和方法。

我想将结构化数据保存在数据库中。JSON.stringify() 可以完美地提取数据并保存结构。但是如何回到对象呢?JSON.parse() 失败,因为它重新创建了没有方法的对象。

在这种情况下我该怎么办?我应该编写自己的函数来从字符串重新创建对象吗?或者我应该以某种方式将数据与方法一起保存(似乎是一种浪费)。

正如我所知道的结构,如果有可能指向一个对象并告诉“这是一个父对象”并且它会得到方法,那将非常方便。那时我可以轻松地循环通过它。但我不知道该怎么做,而且我也担心我的构造函数可以将一些值设置为默认值。

对象构造函数看起来像这样:

function lines()
{
    this.lines = [];
    this.height = 0.5*theMargin;

    this.addLine = addLine;

    function addLine(newline)
    {
        this.lines.push(newline);
        this.height += newline.height;
    }
}

function aLine()
{
    this.dots = [];
    this.height = 0;
    this.length = indent;

    this.insertDot = insertDot;

    function insertDot(pos,newDot)
    {
        this.dots.splice(pos,0,newDot);
        this.length += newDot.length;
        this.height = Math.max(this.height,newDot.height);
        if (this.length > maxLineLength)
        { "I will not go into details here" }
    }
}

然后我会喜欢:

var a = new lines();
var testline = new aLine();
var testdot = new aDot();

testdot.height = 10;
testdot.length = 15;
testline.insertDot(0,testdot);
a.addLine(testline);
a.addLine(testline);

然后我想保存有关长度和高度的数据。和结构,要知道哪个点属于哪条线。

我将该数据发送到网络服务器。我认为这些是理解所用方法的关键:

post = "name=" + name + "&tab=" + JSON.stringify(file);
req.open("POST", "saveFile.php", true);
req.send(post);

保存的文件正是我想要的——结构和数据。但我不知道如何让它再次成为一个对象。我不坚持使用 JSON.stringify() 方法。我会喜欢任何可以让我保存内容而无需重复保存方法的方法。

4

2 回答 2

1

如果您出于某种原因真的迷上了保存整个对象的想法,那么我建议您使用 toString() 方法,该方法本质上将在函数上调用时以字符串的形式返回函数的代码体。

var obj = { func: function() { alert('hello!'); };
for(var key in obj)
    if (typeof obj[key] === 'function')
       alert(obj[key].toString());

除了 json 数据之外,您只需添加代码来序列化和存储此信息。

话虽如此,您确实应该简单地存储对象的状态并将它们重新加载到您的应用程序中。

编辑:重建对象客户端

免责声明:我不是 PHP 专家,因此您只能找到一个实际的编码示例,但我相信有一个具有全能 Google 力量的示例。

您只需使用您的序列化/反序列化类将数据序列化回您的对象。所以想象一下伪代码部分是特定页面的 php 文件:

<?php
 <html>
      <head>
          <script type="text/javascript">
              var model = /* Use serializing class on your server-side object */;
              //Now you just need to build a function into your objects that is much like a constructor that can receive this model and rebuild the object

              function rebuildObject(yourObject, jsonModel) {
                  //assign first property
                  //assign second etc...
              }
           </script>
      </head>
      <body>
      </body>
</html>
?>

您实际上是将 json 数据模板化回脚本标记中的页面,以便您可以在客户端访问它。javascript 解释器会自动将 json 转换为您的代码可以使用的实际 js 对象,因此没有问题。

于 2013-04-09T14:09:29.043 回答
1

最后,我选择了直接的方法来重新创建所有对象并复制数据。结果证明它比我之前想象的更短更漂亮。如果它对其他人有用,我是这样做的:

data = JSON.parse(file);
a = new lines();

a.height = data.height;

for (var i=0; i<data.lines.length; i++)
{
    a.lines.push(new aLine());
    a.lines[i].height = data.lines[i].height;
    a.lines[i].length = data.lines[i].length;
    for (var j=0; j<data.lines[i].dots.length; j++)
    {
        a.lines[i].dots.push(new aDot());
        [... and so on ...]
    }
}
于 2013-04-12T18:59:27.400 回答