我有JavaScript“Class”,它使js对象变得更聪明。我将这些对象序列化为localStorage并恢复它们。但是这些恢复的对象不是类的实例。恢复的对象只是属性集。所以,我设置了这些对象的__proto__ 我已经读过,使用__proto__是错误的(缓慢和弃用的)方法,使对象变得更聪明。
这些问题的智能解决方案是什么?如何恢复JavaScript对象以使它们成为相应类的实例?
var showMarks = function (locals) {
var myMarks = locals.myMarks = locals.myMarks.slice(0, 120);
for (var i = myMarks.length - 1; i >= 0; i--) {
myMarks[i].__proto__ = Mark.prototype;
}
}
showMarks(JSON.parse(localStorage.myMarks));
答案 0 :(得分:1)
正确的解决方案是使用方法进行序列化,并使用一个方法来反序列化您的实例。 JSON.stringify / parse适用于普通对象,但如果你想要更多,你必须制作自定义方法。
具有私有属性的类的示例:
function Cls(name) {
var private_name = name; // private!
this.getName = function() { return private_name; }
}
Cls.prototype.sayHi = function() {
console.log(this.getName() + ' says hi!');
}
// serialization
Cls.prototype.toJSON = function() {
return JSON.stringify({ // add what you need to reconstruct the class in it's current state
name : this.getName()
});
}
Cls.fromJSON = function(str) {
return new Cls(JSON.parse(str).name); // you might need to have a special case in the constructor for this
}
// usage:
var c = new Cls('me');
var serialization = c.toJSON();
var clone = Cls.fromJSON(serialization);
clone.sayHi()
答案 1 :(得分:1)
更新根据评论,我在myMarks中添加了原始文字对象的替换
您可以首先实现您的类,然后循环访问对象的属性以在实例化后设置它们
var mark, key;
for (var i = myMarks.length - 1; i >= 0; i--) {
mark = new Mark();
for (key in myMarks[i]) {
if (myMarks[i].hasOwnProperty(key)) {
mark[key] = myMarks[i][key];
}
}
// replace previous plain object with the new instance of Mark
myMarks[i] = mark;
}
答案 2 :(得分:1)
我想你可以在存储它们之前添加一个表明它们所属类的属性(即:.__class
)。
然后,你可以写一个函数(比如说restore(obj)
):
function restore(obj){
switch(obj.__class){
case "Class1":
return new Class1(obj.a, obj.b);
}
return null;
}