2008-10-09 154 views
12

我知道如何使用JSON來創建對象,但似乎沒有辦法使用JSON來創建具有特定對象類型的對象。如何使用JSON創建從對象類型繼承的對象?

下面是一個對象的實例,並創建它的一個實例:

Person = function() { }; 
Person.prototype = { 
    FirstName: null, 
    GetFirstName: function() { 
     return this.FirstName; 
    } 
}; 

//Create an instance of the Person Object 
var me = new Person(); 
me.FirstName = "Chris"; 
alert(me.GetFirstName()); //alert the FirstName property 

現在,我想用JSON來創建一個新的Person對象,這樣的getFirstName函數的工作就可以了。

這裏的東西一樣,我希望做的(但是這個代碼不工作):

var you = new Person() { FirstName: "Mike" }; 
// OR 
var you = new Person{ FirstName: "Mike" }; 

反正是有使用JSON來創建一個對象,它是一個特定類型的?

更新:我與Person對象的示例只是爲了簡化問題。實際上,我無法修改我需要創建實例的實際對象的構造函數。這些對象是第三方庫的一部分。

更新:使用下面的一些建議,我能夠找出一種方法來創建一個從原始繼承的對象,並在其構造函數中接受JSON。這很整潔!

personWrapper = function(obj){ 
    for(var o in obj){ 
     this[o] = obj[o]; 
    } 
}; 
personWrapper.prototype = new Person(); 

var you = new personWrapper({FirstName: "Chris"}); 
alert(you.GetFirstName()); 
alert(you instanceof Person); // returns True - we are successfully inheriting from Person! 

回答

13

我不這麼認爲。如果我是你,我會在Person類上創建一個從JSON對象初始化的函數。

function Person() { 
    this.loadFromJSON = function(json) { 
     this.FirstName = json.FirstName; 
    }; 
} 

如果您不知道JSON對象事先表示了什麼類,那麼可能會在JSON中添加一個額外的變量。

{ _className : "Person", FirstName : "Mike" } 

然後有一個'builder'函數來解釋它。

function buildFromJSON(json) { 
    var myObj = new json["_className"](); 
    myObj.loadFromJSON(json); 
    return myObj; 
} 

更新:既然你說類是第三方庫的一部分,你無法改變,你既可以擴展類原型,或寫這只是填充類中的函數外部。

如:

Person.prototype.loadFromJSON = function(json) { 
    // as above... 
}; 

function populateObject(obj, json) { 
    for (var i in json) { 
     // you might want to put in a check here to test 
     // that obj actually has an attribute named i 
     obj[i] = json[i]; 
    } 
} 
+2

這是非常微軟的Ajax是如何工作的。您可以定義一個返回特定類型的方法。 ajax層查詢類型並創建一個js對象代理。然後,所有的json調用都會返回一個'__type'參數,告訴庫使用哪個代理實例化對象。 – Travis 2008-10-09 00:13:32

4

你可以讓新的Person()接受一個對象來填充作爲參數屬性。

var you = new Person({ firstName: 'Mike' }); 
+0

事實上,這就是幾個JS框架在構造時會採用「選項」對象來覆蓋對象的默認屬性。 – 2008-10-09 00:26:04

2

你可以從它們派生一個對象。您的構造函數可以接受你想要的對象,但稱自己的構造函數不受影響的時尚:

function yourWrapper(obj) { 
    theirObject.call(this); 
    for (var s in obj) { 
     this[s] = obj[s]; 
    } 
} 
yourWrapper.prototype = new theirObject(); 

或者類似的東西:)