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

314*_*926 3 javascript json private object save

我尝试保存一个像字符串这样的对象,为此我使用了它,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>
Run Code Online (Sandbox Code Playgroud)

输出是:{“prop2”:2}

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

Tib*_*bos 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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然该fromJSON方法可以是一个普通函数(我只是碰巧通过将其添加到构造函数中,在传统 OOP 意义上使 Class1 类成为“静态”),但该toJSON方法需要访问构造函数的局部变量,因此它必须在构造函数内定义。

正如 @JamesHill 在评论中提到的,如果存在toJSON方法可以简化序列化实现。您只需返回一个普通对象,其中包含要序列化的属性(应该是允许您在反序列化过程中恢复实例的属性)。