2016-02-29 65 views
1

我可能不是第一個這樣做,但我找不到或找出如何做到這一點。從服務器加載一個JavaScript對象到一個現有的javascript對象

在我的JavaScript我有一個對象具有5個屬性,它們都是具有數據屬性和功能的對象。

所以它看起來像這樣

function Maindata() { 
    var obj = this; 
    this.id = null; 
    this.profile= new Profile(); 
    this.company= new Company(); 
    //and more 
    this.getid = function(){ 
     return obj.id; 
    }; 
} 

profilecompany對象還具有數據和功能。

現在我從服務器獲取一個對象,它是同一個對象,但只有數據,而不是函數。

現在我想將檢索到的對象的所有屬性從服務器投影到我的JavaScript對象。

我讀過使用jQuery Extend,但這對我不起作用,因爲它只保留根(Maindata)對象上的函數,而不保留子對象上的函數。

我怎樣才能加載子對象的所有數據呢?

我必須$擴展子對象一個接一個,比如這個:

$.extend(true, maindata.profile, result.profile); 
$.extend(true, maindata.company, result.company); 

或有另一種解決方案?

回答

2

首先,在一般 - 你希望把所有的功能在原型和對象本身上的所有數據:

function Maindata() { 
    var obj = this; 
    this.id = null; 
    this.profile= new Profile(); 
    this.company= new Company(); 
    //and more 
} 
Maindata.prototype.getid = function() { 
    return this.id; 
}; 

原型被分配到與Maindata創建作爲構造每個對象並且在所有Maindata實例中共享共享。所以它可能更有效和更容易推理。這有點像其他語言的類。

這意味着你可以這樣做:

// creates an object with the given prototype without running the constructor 
var o = Object.create(Maindata.prototype); 
$.extend(o, result); // copy data over 
// Object.assign(o, result); // with ES2015 assign syntax. 

如果你的對象是嵌套的 - 那麼你需要做到這一點在子屬性嵌套方式。你不能免費獲取類型,因爲它們沒有在JSON中編碼。您可以實現自動爲您自動執行此操作的自定義序列化程序 - 像Backbone這樣的庫可以爲您執行此操作,但IMO會執行相當糟糕的工作,並且自己執行此操作非常簡單。

相關問題