Javascript 如何解析对象,使对象成为类的实例?

Javascript 如何解析对象,使对象成为类的实例?,javascript,json,prototype,Javascript,Json,Prototype,我有JavaScript“类”,可以使js对象更智能。我将这些对象序列化到localStorage并还原它们。但这些恢复的对象不是类的实例。恢复的对象只是属性集。所以,我确实设置了这些对象的原型。 我已经读到使用proto使对象更智能的方法是错误的(缓慢且不推荐) 这些问题的智能解决方案是什么?如何恢复JavaScript对象,使它们成为相应类的实例 var showMarks = function (locals) { var myMarks = locals.myMarks = lo

我有JavaScript“类”,可以使js对象更智能。我将这些对象序列化到localStorage并还原它们。但这些恢复的对象不是类的实例。恢复的对象只是属性集。所以,我确实设置了这些对象的原型。
我已经读到使用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));

正确的解决方案是使用一个方法序列化实例,另一个方法取消序列化实例。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.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()

更新根据评论,我为每个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;
}

更新根据评论,我为每个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;
}

我想您可以在存储它们之前添加一个属性,指明它们所属的类(即:
\uu class
)。
然后,您可以编写一个函数(比如说
restore(obj)
):


我想您可以在存储它们之前添加一个属性,指明它们所属的类(即:
\uu class
)。
然后,您可以编写一个函数(比如说
restore(obj)
):


这是解决方案,但不是我的问题。也许有一天我的json结构会变得更加困难,我会使用这种方法。这是解决方案,但不是我的问题。也许有一天我的json结构会变得更加困难,我会使用这种方法。我不知道这如何解决我的问题。我有一个带有对象数组的字符串,所以我无法将JSON字符串传递给构造函数。解析字符串后我得到了JSON结构。恐怕我不理解您的问题。看到其他答案如何解决同样的问题,我认为问题在于你的解释。我看不出这如何解决我的问题。我有一个带有对象数组的字符串,所以我无法将JSON字符串传递给构造函数。解析字符串后我得到了JSON结构。恐怕我不理解您的问题。看到其他答案如何解决同样的问题,我认为问题在于你的解释。设置属性后,我还需要Mark.init并将新创建的Mark对象放回数组。@DmitryKaigorodov更新了我的答案,告诉我,如果我搞错了,在设置属性并将新创建的标记对象放回数组后,我还需要Mark.init。@DmitryKaigorodov更新了我的答案,如果我搞错了,请告诉我