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

Posted

技术标签:

【中文标题】Javascript:如何将带有私有字段的对象保存到文件中?【英文标题】:Javascript: how to save object with private fields to file? 【发布时间】: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,是的,但我仍然需要一种方法来保存整个对象数据 在这种情况下,恐怕你必须创建公共方法来获取这些私有属性,然后创建一个新对象,其中包含这些私有值的公共属性。 那不是私有字段,那是局部变量...也许应该编辑 【参考方案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)

以上是关于Javascript:如何将带有私有字段的对象保存到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

从 json 动态创建的 Javascript 表单输入,需要将对象映射到另一个对象的正确字段并保存

Javascript:带有公共访问器的私有对象

如何对新的 JS 功能提出建议?

如何从 JavaScript 中的父类访问私有字段?

不可变类/对象、私有构造函数、工厂方法

如何以一个名称将多个对象保存到 CoreData