2014-02-27 24 views
0

我有一個現有的客戶端應用程序,使得使用JavaScript對象是這個樣子的:移除和重新映射到來自JavaScript函數對象的屬性

var myObject = { 
    Id: 1, 
    Name: 'Foo', 
    Property1: 123, 
    Property2: 'ABC', 
    MyMethod: function() { ///do something }, 
    MyMethod2: function() { /// do something else } 
}; 

我現在正在嘗試使用,以保存這些對象Firebase等服務。 Firebase不喜歡包含這些功能的屬性,因此我想知道在保存到Firebase時是否存在一種「簡單」方式來刪除違規功能,然後在檢索時重新附加它們,而不必創建每個對象。

+0

我想這可能已經在這裏找到答案的http:// stackoverflow.com/questions/208105/how-to-remove-a-property-from-a-javascript-object?rq=1 – Ollie

+0

看到上面的答案,但我也會添加一些像$ other「:{」.validate 「:false}到您的安全規則。 –

回答

1

一個相當常見的模式是有一個構造函數,其中附帶了相關函數,並讓該構造函數接受它用來填充自身的對象的原始版本以及「toRaw」或類似的函數這給你的原始副本。

例如:

function Thingy(raw) { 
    var name; 
    for (name in raw) { 
     if (raw.hasOwnProperty(name)) { 
      this[name] = raw[name]; 
     } 
    } 
} 
Thingy.prototype.MyMethod = function() { /* ... */ }; 
Thingy.prototype.MyMethod2 = function() { /* ... */ }; 
Thingy.prototype.toRaw = function() { 
    var raw, name, value; 
    for (name in this) { 
     if (this.hasOwnProperty(name)) { 
      value = this[name]; 
      if (typeof value !== "function") { 
       if (value.toRaw) { 
        raw[name] = value.toRaw(); 
       } else { 
        raw[name] = this[name]; 
       } 
      } 
     } 
    } 
}; 

然後保存文檔時,火力地堡:

write(myObject.toRaw()); 

...從火力地堡讀取時:

var obj = new Thingy(read()); 

更復雜的處理將涉及把一個在原始對象上的備忘錄告訴你,對象的一個​​屬性本身是否使用該模式,所以你知道爲它調用構造函數而不是僅僅複製它。 (眼尖會注意到,上面的例子是不對稱的,它允許toRawtoRaw序列化時的特性,但在Thingy不反序列化時。)

相關問題