【问题标题】:Javascript: how to save object with private fields to file?Javascript:如何将带有私有字段的对象保存到文件中?
【发布时间】:2014-01-29 07:01:28
【问题描述】:

我尝试保存一个像字符串这样的对象,为此我使用JSON.stringify(),但它只获取公共字段。

如何获取私服?

<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>

输出为:{"prop2":2}

我想要 {"prop1":1, "prop2":2}

【问题讨论】:

  • 如果它们是私有的,它们应该不能在类上下文之外访问,对吧?
  • @DontVoteMeDown,是的,但我仍然需要一种方法来保存整个对象数据
  • 在这种情况下,恐怕你必须创建公共方法来获取这些私有属性,然后创建一个新对象,其中包含这些私有值的公共属性。
  • 那不是私有字段,那是局部变量...也许应该编辑

标签: javascript json object save private


【解决方案1】:

“私有属性”实际上并没有在您的对象中找到,它只是构造函数范围内的变量。如果您通过方法与它进行交互,那么它将通过闭包对这些方法可用。

如果你想用它的私有属性序列化一个对象,你需要编写你自己的序列化和反序列化方法来访问私有属性(通过闭包),如上所述。

一些帮助您入门的代码:

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 方法可以简化序列化实现。您只需要返回一个包含您想要序列化的属性的普通对象(应该是允许您在反序列化过程中恢复实例的属性)。

【讨论】:

  • 不是在你的类上定义this.serialize,你可以定义this.toJSON(),返回你想要序列化的对象——这样做的原因是JSON.stringify寻找一个toJSON方法首先在对象上,并使用它来获取对象的表示,如果存在(有点像在 Java 中覆盖 toString)