2014-02-12 38 views
1

我有使類似js對象更加智能的JavaScript類。我將這些對象序列化到localStorage並恢復它們。但是這些恢復的對象不是一個類的實例。恢復的對象只是屬性集。所以,我確實設置了這些對象的__proto__。
我讀過使用__proto__是錯誤的(緩慢和不贊成)的方法來使對象更聰明。如何將JSON.parse對象設置爲使對象成爲類的實例?

這些問題的智能解決方案是什麼?如何恢復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)); 

回答

1

UPDATE根據意見,我添加了一個替代原來的文字對象的foreach 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; 
} 
+0

設置屬性後,我也需要Mark.init,並將新創建的Mark對象放回數組。 –

+1

@DmitryKaigorodov更新了我的答案,告訴我我是否錯了 – axelduch

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() 
+0

我看不出這能解決我的問題。我有單個字符串與對象的數組,所以我無法將JSON字符串傳遞給構造函數。解析字符串後我有JSON結構。 –

+0

恐怕我不明白你的問題。看到其他答案如何解決同樣的問題,我認爲問題在於你的解釋。 – Tibos

1

我想你可以在存儲它們之前添加一個屬性,指示它們所屬的類(即:.__class)。
然後,您可以編寫一個函數(假設restore(obj)):

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

這是解決方案,但不是我的問題。可能有一天,當我的json結構變得更加困難時,我會使用這種方法。 –

相關問題