【问题标题】:How to JSON.parse objects so that objects will be instances of the class?如何 JSON.parse 对象,使对象成为类的实例?
【发布时间】:2014-02-14 17:18:26
【问题描述】:

我有让 js 对象更智能的 JavaScript“类”。我将这些对象序列化到 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));

【问题讨论】:

    标签: javascript json prototype


    【解决方案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;
    }
    

    【讨论】:

    • 设置属性后我还需要 Mark.init 并将新创建的 Mark 对象放回数组。
    • @DmitryKaigorodov 更新了我的答案,如果我记错了告诉我
    【解决方案2】:

    我想您可以在存储它们之前添加一个属性来指示它们所属的类(即:.__class)。
    然后,你可以写一个函数(比如restore(obj)):

    function restore(obj){
        switch(obj.__class){
            case "Class1":
                return new Class1(obj.a, obj.b);
        }
        return null;
    }
    

    【讨论】:

    • 这是解决方案,但不是我的问题。可能有一天我的 json 结构会变得更加困难,我会使用这种方法。
    【解决方案3】:

    正确的解决方案是有一个方法来序列化和反序列化您的实例。 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()
    

    【讨论】:

    • 我看不出这如何解决我的问题。我有一个带有对象数组的字符串,所以我无法将 JSON 字符串传递给构造函数。解析字符串后我有 JSON 结构。
    • 恐怕我不明白你的问题。看到其他答案如何解决相同的问题,我认为问题在于您的解释。
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2017-04-16
    相关资源
    最近更新 更多