如何使用JSON.parse对象使对象成为类的实例?

时间:2014-02-12 11:34:18

标签: javascript json prototype

我有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));

3 个答案:

答案 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;
}
相关问题