2014-01-10 52 views
0

我試圖保存一個對象,像字符串,爲此我使用JSON.stringify(),但它只拾取公共字段。Javascript:如何保存對象與私人領域的文件?

如何抓住私人?

<html> 
<head> 
    <title></title> 
</head> 
<body> 

    <script> 
     function Class1() { 
      var prop1 = 1; 
      this.prop2 = 2; 
     }; 

     var inst1 = new Class1(); 

     var str = JSON.stringify(inst1); 

     console.log(str); 
    </script> 
</body> 
</html> 

輸出爲:{ 「PROP2」:2}

,我想{ 「PROP1」:1, 「PROP2」:2}

+0

如果他們是私人的,他們不應該在類的背景下訪問,對吧? – DontVoteMeDown

+0

@DontVoteMeDown,true,但我仍然需要一種方法來保存整個對象數據 – 31415926

+1

在這種情況下,我擔心您必須創建公共方法才能獲取這些私有屬性,然後創建一個具有使用這些私有值填充的公共屬性的新對象。 – DontVoteMeDown

回答

1

的 「私有財產」 實際上不是在你的對象內部發現,它只是構造函數作用域中的一個變量。如果你通過方法與它進行交互,那麼它將通過閉包而被這些方法所使用。

如果要使用其私有屬性序列化對象,則需要編寫自己的序列化和反序列化方法,以便如上所述訪問私有屬性(通過閉包)。

一些代碼來讓你開始:

function Class1(opt_prop1, opt_prop2) { 
    var prop1 = opt_prop1 || 1; 
    this.prop2 = opt_prop2 || 2; 

    this.toJSON = function() { 
    return { prop1 : prop1, prop2 : this.prop2 }; 
    }; 
} 

Class1.fromJSON = function(str) { 
    var obj = JSON.parse(str); 
    return new Class1(obj.prop1, obj.prop2); 
} 

注意的是,雖然fromJSON方法可以正常功能(我正好使「靜態」到Class類傳統OOP意義上加入它的構造函數),toJSON方法需要訪問構造函數的局部變量,所以它必須在構造函數中定義。

正如@JamesHill在評論中提到的,如果存在toJSON方法可以簡化序列化實現。你只需要返回一個包含你想序列化屬性的簡單對象(這應該是允許你在反序列化過程中恢復實例的屬性)。

+1

而不是定義在您的類'this.serialize',你可以改爲定義'this.toJSON()',返回你想要序列化的對象 - 原因這樣做是因爲JSON.stringify首先在對象上查找'toJSON'方法,並使用它來獲得對象的表示(如果存在的話)(有點像在Java中重寫toString) –