Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:如何将带有私有字段的对象保存到文件?_Javascript_Json_Object_Save_Private - Fatal编程技术网

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

Javascript:如何将带有私有字段的对象保存到文件?,javascript,json,object,save,private,Javascript,Json,Object,Save,Private,我尝试将对象保存为字符串,为此我使用了JSON.stringify(),但它只拾取公共字段 如何抢私家车 <html> <head> <title></title> </head> <body> <script> function Class1() { var prop1 = 1; this.prop2 = 2; }

我尝试将对象保存为字符串,为此我使用了
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>

函数Class1(){
var prop1=1;
这个.prop2=2;
};
var inst1=new Class1();
var str=JSON.stringify(inst1);
console.log(str);
输出为:{“prop2”:2}

我想要{“prop1”:1,“prop2”:2}

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

如果要用私有属性序列化对象,则需要编写自己的序列化和反序列化方法,以访问私有属性(通过闭包),如上所述

一些代码可以帮助您开始:

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
方法可以是一个普通函数(我只是碰巧通过将Class1类添加到构造函数中,在传统OOP意义下对其进行了“静态”处理),但
toJSON
方法需要访问构造函数的局部变量,因此必须在构造函数中定义它


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

如果它们是私有的,则不应在类上下文之外访问它们,对吗?@DontVoteMeDown,是的,但我仍然需要一种保存整个对象数据的方法。在这种情况下,恐怕您必须创建公共方法来获取这些私有属性,然后创建一个新对象,其中的公共属性填充了这些私有值。这不是私有字段,这是局部变量。。。也许你应该编辑而不是在你的类上定义
this.serialize
,你可以定义
this.toJSON()
,返回你想要序列化的对象-这样做的原因是JSON.stringify首先在对象上寻找
toJSON
方法,并使用它来获取对象的表示(如果存在的话)(有点像在Java中重写toString)