2008-10-09 16 views
12

Je sais comment utiliser JSON pour créer des objets, mais il ne semble pas nécessaire d'utiliser JSON pour créer un objet d'un type d'objet spécifique.Comment utiliser JSON pour créer un objet qui hérite du type d'objet?

Voici un exemple d'un objet et la création d'une instance de celui-ci:

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 

Maintenant, je voudrais utiliser JSON pour créer un nouvel objet Personne de telle sorte que la fonction getFirstname travaille.

Voici quelque chose comme ça je cherche à faire (mais ce code ne fonctionne pas):

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

est-il de toute façon d'utiliser JSON pour créer un objet qui est d'un type spécifique?

MISE À JOUR: Mon exemple avec l'objet Person est juste pour simplifier la question. En fait, je suis incapable de modifier les constructeurs des objets réels dont j'ai besoin pour créer des instances. Les objets font partie d'une bibliothèque tierce. MISE À JOUR: En utilisant certaines des suggestions ci-dessous, j'ai été capable de trouver un moyen de créer un objet qui hérite de l'original, et j'accepte JSON dans son constructeur. C'est propre!

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! 

Répondre

13

Je ne m'imagine pas. Je créerais une fonction sur la classe Person pour initialiser à partir d'un objet JSON si j'étais vous.

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

Si vous ne savez pas quelle classe l'objet JSON représentait au préalable, peut-être ajouter une variable supplémentaire dans votre JSON.

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

Et puis avoir une fonction 'builder' qui l'interprète.

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

Mise à jour: puisque vous dites que la classe fait partie d'une bibliothèque tiers que vous ne pouvez pas changer, vous pouvez étendre la classe avec le prototypage ou écrire une fonction qui remplit juste la classe extérieurement.

par exemple:

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

ou

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

C'est à peu près exactement comment fonctionne Microsoft Ajax. Vous définissez une méthode qui renvoie un type spécifique. La couche ajax interroge ce type et crée un proxy d'objet js. Ensuite, tous les appels json renvoient un paramètre '__type' qui indique à la bibliothèque quel proxy utiliser pour instancier l'objet. – Travis

4

Vous pouvez permettre une nouvelle personne() d'accepter un objet pour remplir les attributs avec comme paramètre.

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

En fait, c'est ainsi que plusieurs frameworks JS prennent un objet "options" pour remplacer les propriétés par défaut d'un objet au moment de la construction. –

2

Vous pouvez dériver un objet du leur. Votre constructeur peut accepter l'objet que vous voulez, mais appeler leur constructeur de façon non affectée:

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

Ou quelque chose comme ça :)