JavaScript:如何将具有私有字段的对象保存到文件?

3

我试图保存一个像字符串一样的对象,为此我使用了 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
@DontVoteMeDown,没错,但我仍然需要一种保存整个对象数据的方法。 - 31415926
1
在这种情况下,恐怕您必须创建公共方法来获取这些私有属性,然后创建一个新对象,其中公共属性填充了这些私有值。 - DontVoteMeDown
1
这不是私有字段,而是局部变量...也许应该编辑。 - Darko Rodic
1个回答

5
“私有属性”实际上并不在您的对象内部,它只是构造函数作用域中的一个变量。如果通过方法与其交互,则通过闭包,这些方法将可以访问它。
如果您想序列化带有私有属性的对象,您需要编写自己的序列化和反序列化方法,以便可以像上面解释的那样访问私有属性(通过闭包)。
以下是一些可供参考的代码:
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 方法,则可以简化序列化实现。您只需返回一个包含要序列化的属性的纯对象(这些属性应该是允许您在反序列化过程中恢复实例的属性)。

1
不要在你的类上定义 this.serialize,而是可以定义 this.toJSON(),返回你想要序列化的对象 - 这样做的原因是 JSON.stringify 首先查找对象上的 toJSON 方法,并使用它来获取对象的表示形式(有点像 Java 中的覆盖 toString)。 - James Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接