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