2011-08-31 79 views
0

所以我有一個Module對象,並且我有使用以下從模塊繼承AdvModule對象:如何以json字符串的形式將對象保存到數據庫並稍後重新加載?

function object(o) { 
    function F() { } 
    F.prototype = o; 
    return new F(); 
} 
function inheritPrototype(subtype, supertype) { 
    var prototype = object(supertype.prototype); 
    prototype.constructor = subtype; 
    subtype.prototype = prototype; 
} 

inheritPrototype(AdvModule, Module); 

模塊有一個名爲「設置」一個對象變量,它包含的東西,如X,Y,高度,寬度等。目前我將這些設置保存爲json格式的數據庫。然後,刷新頁面時,將從數據庫中提取這些設置以重新創建該模塊。

但是現在我也有了AdvModule,並且當前沒有設置中的任何東西表明它應該是什麼樣的對象。我知道我可以分配一個字符串值,並在switch語句中使用它來決定使用這些設置構建哪些對象,但是我希望避免switch語句,因爲從Module繼承的對象數是易失性的,不希望其他開發者不得不進入並不斷改變switch語句。我希望設置知道要構建的對象。

我已經嘗試添加另一個值'設置',即對象的名稱:即 - > {類型:AdvModule}和我使用這個時加載像 - > item = new settings.type();這似乎工作。 但是,當我去保存到我的數據庫JSON.Stringify似乎拋出或忽略它。

任何幫助/建議將不勝感激。感謝

+0

請您用一兩句話總結一下這個問題。您在儲存時遇到問題?加載?在客戶端上使用JSON設置?很難說。故事太長了。 –

回答

1

{ type : AdvModule }不是有效的JSON對象除非AdvModule是一個字符串,號碼,數組或JSON對象(未JavaScript對象,而是作爲由JSON定義的對象,即,「一組無序名稱/值對」 [1] )。如果AdvModule是一個類或其他複雜的JavaScript對象,那麼JSON.stringify確實會拋出。

的解決方案是存儲對象,而不是對象本身的名稱,即:

var settings = { type : "AdvModule" }; 

然後,當你想要實例它,你會做這樣的事情:

var thing = new window[settings.type]; 

這相當於調用new window.AdvModule(如果AdvModule不在全局命名空間中,即window,則用正確的上下文替換window)。

+0

工作偉大!非常感謝。我知道我很接近,但沒有意識到我可以使用'窗口'。 – Zholen

相關問題