2008-10-09 6 views
12

Wiem, jak używać JSON do tworzenia obiektów, ale wydaje się, że nie ma miejsca, aby użyć JSON do utworzenia obiektu, który jest określonego typu obiektu.Jak używać JSON do tworzenia obiektu dziedziczącego z typu obiektu?

Oto przykład obiekt i utworzenia wystąpienia go:

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 

Teraz chciałbym użyć JSON, aby utworzyć nowy obiekt Person tak, że funkcja GetFirstName działa na nim.

Oto coś takiego szukam zrobić (ale ten kod nie działa):

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

Czy mimo to używać JSON, aby utworzyć obiekt, który jest od określonego typu?

AKTUALIZACJA: Moja próbka z obiektem Osoba służy tylko do uproszczenia pytania. W rzeczywistości nie jestem w stanie zmodyfikować konstruktorów rzeczywistych obiektów, których potrzebuję do utworzenia instancji. Obiekty są częścią biblioteki innej firmy.

AKTUALIZACJA: Korzystając z poniższych sugestii, udało mi się wymyślić sposób utworzenia obiektu, który dziedziczy z oryginału i zaakceptował JSON w jego konstruktorze. To jest miłe!

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! 

Odpowiedz

13

Nie wyobrażam sobie tego. Stworzyłem funkcję na klasie Person, aby zainicjować z obiektu JSON, gdybym był tobą.

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

Jeśli nie wiesz, którą klasę obiekt JSON reprezentował wcześniej, być może dodaj dodatkową zmienną do swojego JSON.

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

A następnie funkcję "budowniczego", która ją interpretuje.

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

Aktualizacja: skoro mówisz, że klasa jest częścią biblioteki osób trzecich, których nie można zmienić, można też rozszerzyć klasę z prototypów lub napisać funkcję, która po prostu zapełnia klasę zewnętrznie.

np

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

lub

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

Jest to dość dużo jak dokładnie Microsoft Ajax działa. Użytkownik definiuje metodę, która zwraca określony typ. Warstwa ajax wysyła zapytania tego typu i tworzy proxy obiektu JS. Następnie wszystkie wywołania json zwracają parametr "__type", który informuje bibliotekę, którego proxy użyć do utworzenia instancji obiektu. – Travis

4

Można pozwolić nowej osoby(), aby zaakceptować obiekt do wypełnienia z atrybutów jako parametr.

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

Tak naprawdę wiele frameworków JS przyjmuje obiekt "options", aby nadpisać domyślne właściwości obiektu w czasie budowy. –

2

Możesz wyprowadzić obiekt z ich. Twój konstruktor może przyjąć obiekt, który chcesz, ale zadzwonić do konstruktora w niezmienionej mody:

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

czy coś takiego :)