作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试将对象保存为字符串,为此我使用 JSON.stringify()
但它仅获取公共(public)字段。
如何抓私处?
<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}
最佳答案
“私有(private)属性”实际上并不存在于您的对象中,它只是构造函数作用域中的一个变量。如果您通过方法与它交互,那么这些方法将通过闭包使用它。
如果你想用私有(private)属性序列化一个对象,你需要编写自己的序列化和反序列化方法来访问私有(private)属性(通过闭包),如上所述。
一些让你开始的代码:
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方法可以简化序列化实现。您只需要返回一个普通对象,其中包含您要序列化的属性(应该是允许您在反序列化过程中恢复实例的属性)。
关于Javascript:如何将具有私有(private)字段的对象保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21042055/
我是一名优秀的程序员,十分优秀!