Javascript: stringify objet (y compris les membres de la fonction du type)
Je suis à la recherche d'une solution pour sérialiser (et unserialize) des objets Javascript à une chaîne sur tous les navigateurs, y compris les membres de l'objet qui se trouvent être des fonctions. Un objet typique ressemble à ceci:
{
color: 'red',
doSomething: function (arg) {
alert('Do someting called with ' + arg);
}
}
doSomething() ne contiennent que des variables locales (pas besoin de sérialiser le contexte de l'appel!).
JSON.stringify() permet d'ignorer la 'doSomething' membre, car c'est une fonction. J'ai connu le toSource() la méthode permettra de faire ce que je veux mais c'est FF spécifiques.
- Je vais juste laisser un commentaire parce que je ne suis pas offrir une solution complète. Une chose qui peut aider, c'est que vous pouvez stringify une Fonction avec un appel à
toString()
. jsfiddle.net/HFMaz ce n'est Pas sûr de la croix-prise en charge du navigateur. - ceci est demandé régulièrement, mais je ne trouve rien de pertinent :\ pourquoi avez-vous besoin de sérialiser la fonction, de toute façon? peut-être il ya une meilleure façon d'organiser votre code?
- C'est pour WYSIWYG projet. Chaque objet Javascript (avec des méthodes) définit le comportement des composants de la page. Le contenu de la page (y compris JS comportement) doit être enregistré côté serveur, donc sérialisé.
- comment le code est-il créé? il semble que vous devriez avoir accès à une représentation de chaîne de tous à un point antérieur dans le processus.
- J'espère que ce n'est pas utilisée par le grand public alors... sinon, vous devrez vous assurer qu'il n'y a aucun moyen que je peux XSS cette chose.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
JSON.stringify
avec unreplacer
comme:JSON.stringify(myObject, function(key, val) { return (typeof val === 'function') ? '[function]' : val; }, 4);
et il ne sort vraiment sympa.Une façon rapide et sale serait comme ceci:
Évidemment, cela va affecter la sérialisation de chaque objet dans votre code, et pourrait le voyage jusqu'à niave code à l'aide de non filtrée
for in
boucles. La "bonne" façon serait d'écrire une fonction récursive qui permettrait d'ajouter lestoJSON
fonction sur tous les descendants des membres de n'importe quel objet donné, traitement avec des références circulaires et autres. Cependant, en supposant que seul thread Javascript (pas de site Web), les Travailleurs, cette méthode devrait fonctionner et ne produit aucun des effets secondaires indésirables.Une fonction similaire doit être ajouté à la Matrice de prototype pour remplacer l'Objet par le retour d'un tableau et non un objet. Une autre option serait de la fixation d'un seul et laisser sélectivement retourner un tableau ou un objet en fonction de l'objet propre de la nature, mais il serait probablement plus lent.
http://jsbin.com/yerumateno/2/edit
Quelque chose comme ça...
Note: ceci est une expression. Elle renvoie une représentation sous forme de chaîne de l'objet qui est passé en argument (dans mon exemple, je suis de passage le dans une variable nommée obj).
Vous pouvez aussi surcharger la méthode toString de l'Objet prototype:
Il est impossible sans l'aide de l'objet lui-même. Par exemple, comment feriez-vous pour sérialiser le résultat de cette expression?
Si vous prenez le texte de la fonction, lorsque vous désérialisez,
x
fera référence à la variable globale, et non pas une par une fermeture. Aussi, si votre fonction se ferme sur navigateur état (comme une référence à un "div"), vous devriez penser à ce que vous voulez dire.Vous pouvez, bien sûr, écrire vos propres méthodes spécifiques à chacun des objets qui codent ce que la sémantique vous voulez des références à d'autres objets ont.
JSONfn plugin est exactement ce que vous cherchez.
http://www.eslinstructor.net/jsonfn/
--Vadim