我试图保存像字符串这样的对象,为此我使用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}
答案 0 :(得分: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类的“静态”),但{{1}方法需要访问构造函数的局部变量,因此必须在构造函数内定义。
正如@JamesHill在评论中所提到的,如果存在,toJSON方法可以简化序列化实现。您只需返回一个包含要序列化的属性的普通对象(应该是允许您在反序列化过程中还原实例的属性)。