La mise en œuvre de Mozilla toSource() dans Internet Explorer
Quelqu'un a mis en œuvre de Mozilla Objet.toSource() méthode pour Internet Explorer et autres navigateurs Gecko? Je suis à la recherche d'un moyen léger de sérialiser des objets simples dans les chaînes.
toSource(): (function () {alert("l'avertissement à l'ordinateur");})
ou encore:
javascript:
x=[];x[3]=x;
alert('toSource():\t'+x.toSource());
alert('JSON can not handle this at all and goes "infinite".');
alert('JSON:\n'+JSON.stringify(x));
qui s'affiche:
toSource(): #1=[, , , #1#]
et le "à " infinie" message d'où suit JSON de stackoverflow récursive digression.
Les exemples soulignent les subtilités de l'expression explicitement exclus de la représentation JSON qui sont rendus par toSource().
Il n'est pas facile de composer un programme de reproduire les mêmes résultats, dans TOUS les cas, comme le Gecko toSource() primitive, ce qui est exceptionnellement puissant.
Ci-dessous sont quelques-uns des 'cibles en mouvement" qu'un programme de duplication toSource() fonctionnalité DOIT gérer avec succès:
javascript:function render(title,src){(function(objRA){
alert([ title, src,'\ntoSource():',objRA.toSource(),'\nJSON:',JSON.stringify(objRA)].join('\n'));})(eval(src));}
render('Simple Raw Object source code:','[new Array, new Object, new Number, new String, '+'new Boolean, new Date, new RegExp, new Function]');
render('Literal Instances source code:','[ [], 1, true, {}, "", /./, new Date(), function(){} ]');
render('some predefined entities:','[JSON, Math, null, Infinity, NaN, '+'void(0), Function, Array, Object, undefined]');
qui s'affiche:
Simple Objet Brut code source:
[nouvel ensemble, nouvel Objet, nouveau Numéro, nouvelles de la Chaîne,
new Boolean, nouvelle Date, new RegExp, nouvelle Fonction]
toSource():
[[], {}, (nouveau Numéro(0)), (new String("")),
(new Boolean(false)), (nouvelle Date(1302637995772)), /(?:)/,
(fonction anonyme() {})]
JSON:
[[],{},0,"",false,"2011-04-12T19:53:15.772 Z",{},null]
et affiche ensuite:
Littérale des Instances de code source:
[ [], 1, true, {}, "", /./, new Date(), function(){} ]
toSource():
[[], 1, true, {}, "", /./, (new Date(1302638514097)), (function () {})]
JSON:
[[],1,true,{},"",{},"2011-04-12T20:01:54.097 Z",null]
et enfin:
certaines des entités prédéfinies:
[JSON, Mathématiques, null, Infini, NaN, void(0),
Fonction, Array, Object, undefined]
toSource():
[JSON, Mathématiques, null, Infini, NaN, (void 0),
la fonction Function() {[native code]}, la fonction Array() {[native code]},
Objet function() {[native code]}, (void 0)]
JSON:
[{},{},null,null,null,null,null,null,null,null]
L'analyse précédente est important si les traductions sont '' ou moins sévères si le besoin est pour de simples bénigne de la consommation humaine, à la vue d'un objet intérieur. Une primaire JSON fonctionnalité, en tant que représentation, le transfert de certaines informations structurées '" entre les environnements.
La qualité d'un toSource() la fonction est un facteur dans le denotational la sémantique d'un programme d'influencer, mais pas limité à:
aller-retour calculs, moins de point fixe propriétés et fonctions inverses.
Ne répétition de la conversion de code
suspendre à un état statique?
Ne obj.toSource() ==
eval(eval(eval(obj.toSource()).toSource()).toSource()).toSource()?
Est-il judicieux d'envisager
si obj == eval(obj.toSource())?
Ne l'annulation d'une conversion résultat, pas
juste un objet similaire, mais un
IDENTIQUE?
C'est un chargé
question avec de profondes implications
lors du clonage d'un système opérationnel d'objet.
et beaucoup, beaucoup plus ...
Noter que les questions ci-dessus, de prendre de l'importance quand obj contient une exécution de code objet, tels que le (la nouvelle Fonction ... )()!
Si l'appariement exact format de sérialisation de Firefox n'est pas votre but, vous pouvez utiliser l'un de l'JavaScript JSON de sérialisation/désérialisation des bibliothèques inscrites au http://json.org. À l'aide d'un schéma standard comme JSON peut-être mieux que d'imiter le propriétaire Gecko format.
Plutôt, si JSON est assez pour l'OP, de ses besoins, c'est à dire pas besoin de décompiler fonctions, permettre à des références circulaires, etc.
Si vous avez besoin de serialise objets avec des références circulaires, vous pouvez utiliser le cycle.js extension de l'objet JSON par Douglas Crockford disponible à https://github.com/douglascrockford/JSON-js. Cela fonctionne très comme toSource(), bien que ce ne sera pas serialise fonctions (mais pourrait probablement être adapté à l'aide d'une fonction de la méthode toString).
Object.prototype.getSource =function(){var output =[], temp;for(var i inthis){if(this.hasOwnProperty(i)){
temp = i +":";switch(typeofthis[i]){case"object":
temp +=this[i].getSource();break;case"string":
temp +="\""+this[i]+"\"";//add in some code to escape quotesbreak;default:
temp +=this[i];}
output.push(temp);}}return"{"+ output.join()+"}";}
Je ne suis pas un expert JavaScript, mais de l'Objet.le prototype est verboten! Voir: erik.eae.net/archives/2005/06/06/22.13.54 c'est Peut-être préférable de mettre en œuvre la présente comme une fonction libre. Ce n'est pas une bonne idée de modifier l'Objet prototype. Aussi un type de chaîne aura besoin plus que juste \" s'échapper. Il aura besoin de s'échapper de \t\n\r etc. C'est une parfaitement belle idée de modifier le prototype d'Objet, à condition que vous savez comment code en JavaScript et ne sont pas à l'aide d'une bibliothèque (comme jQuery) qui a explicitement choisi d'être brisé que si vous le faites (pour le bénéfice de l'augmentation de la vitesse).
Afin de prendre cela un peu plus loin: lorsque vous envoyez quelque chose à travailler sur un récepteur doit obtenir et être capable de travailler sur elle. Si ce bit suivant du code fera l'affaire - adapté de la réponse précédente par Eliran Malka.
//SENDER IS WRAPPING OBJECT TO BE SENT AS STRING//object to serializevar s1 =function(str){return{
n:8,
o:null,
b:true,
s:'text',
a:['a','b','c'],
f:function(){
alert(str)}}};//test
s1("this function call works!").f();//serialized object; for newbies: object is now a string and can be sent ;)var code = s1.toString();//RECEIVER KNOWS A WRAPPED OBJECT IS COMING IN//you have to assign your wrapped object to somevareval('var s2 = '+ code);//and then you can test somevar again
s2("this also works!").f();
Être conscient de l'utilisation de eval. Si vous possédez tous les code en cours de transfert: se sentir libre de l'utiliser (même si elle peut aussi avoir des inconvénients). Si vous ne savez pas où la source est à venir à partir de: c'est un no-no.
[EDIT] en Fait, non! C'est OK pour le vidage rapide mais pas pour de vrai la sérialisation.
J'ai amélioré il, le résultat ci-dessous:
functionSerializeObject(obj, indentValue){var hexDigits ="0123456789ABCDEF";functionToHex(d){return hexDigits[d >>8]+ hexDigits[d &0x0F];}functionEscape(string){returnstring.replace(/[\x00-\x1F'\\]/g,function(x){if(x =="'"|| x =="\\")return"\\"+ x;return"\\x"+ToHex(String.charCodeAt(x,0));})}var indent;if(indentValue ==null){
indentValue ="";
indent ="";//or " "}else{
indent ="\n";}returnGetObject(obj, indent).replace(/,$/,"");functionGetObject(obj, indent){if(typeof obj =='string'){return"'"+Escape(obj)+"',";}if(obj instanceofArray){
result = indent +"[";for(var i =0; i < obj.length; i++){
result += indent + indentValue +GetObject(obj[i], indent + indentValue);}
result += indent +"],";return result;}var result ="";if(typeof obj =='object'){
result += indent +"{";for(varpropertyin obj){
result += indent + indentValue +"'"+Escape(property)+"' : "+GetObject(obj[property], indent + indentValue);}
result += indent +"},";}else{
result += obj +",";}return result.replace(/,(\n?\s*)([\]}])/g,"$1$2");}}
indentValue peut être null, "", " ", "\t" ou quoi que ce soit. Si la valeur est null, pas d'indentation, la sortie d'un plutôt compact résultat (possibilité d'utiliser moins d'espaces...).
J'ai pu utiliser un tableau d'empiler les résultats, puis se joindre à eux, mais à moins d'avoir géant des objets, la concaténation de chaînes devrait être assez bon...
Vous n'avez pas à utiliser toSource(); enveloppez-le code doit être sérialisé dans une fonction qui retourne la struct JSON, et l'utilisation function#toString() à la place:
De considérer les éléments suivants: (lors de l'utilisation de FireFox 3.6)
qui s'affiche:
ou encore:
qui s'affiche:
et le "à " infinie" message d'où suit JSON de stackoverflow récursive digression.
Les exemples soulignent les subtilités de l'expression explicitement exclus de la représentation JSON qui sont rendus par toSource().
Il n'est pas facile de composer un programme de reproduire les mêmes résultats, dans TOUS les cas, comme le Gecko toSource() primitive, ce qui est exceptionnellement puissant.
Ci-dessous sont quelques-uns des 'cibles en mouvement" qu'un programme de duplication toSource() fonctionnalité DOIT gérer avec succès:
qui s'affiche:
et affiche ensuite:
et enfin:
L'analyse précédente est important si les traductions sont '' ou moins sévères si le besoin est pour de simples bénigne de la consommation humaine, à la vue d'un objet intérieur. Une primaire JSON fonctionnalité, en tant que représentation, le transfert de certaines informations structurées '" entre les environnements.
La qualité d'un toSource() la fonction est un facteur dans le denotational la sémantique d'un programme d'influencer, mais pas limité à:
aller-retour calculs, moins de point fixe propriétés et fonctions inverses.
suspendre à un état statique?
eval(eval(eval(obj.toSource()).toSource()).toSource()).toSource()?
si obj == eval(obj.toSource())?
juste un objet similaire, mais un
IDENTIQUE?
C'est un chargé
question avec de profondes implications
lors du clonage d'un système opérationnel d'objet.
et beaucoup, beaucoup plus ...
Noter que les questions ci-dessus, de prendre de l'importance quand obj contient une exécution de code objet, tels que le (la nouvelle Fonction ... )()!
OriginalL'auteur
Si l'appariement exact format de sérialisation de Firefox n'est pas votre but, vous pouvez utiliser l'un de l'JavaScript JSON de sérialisation/désérialisation des bibliothèques inscrites au http://json.org. À l'aide d'un schéma standard comme JSON peut-être mieux que d'imiter le propriétaire Gecko format.
OriginalL'auteur
Si vous avez besoin de serialise objets avec des références circulaires, vous pouvez utiliser le cycle.js extension de l'objet JSON par Douglas Crockford disponible à https://github.com/douglascrockford/JSON-js. Cela fonctionne très comme toSource(), bien que ce ne sera pas serialise fonctions (mais pourrait probablement être adapté à l'aide d'une fonction de la méthode toString).
OriginalL'auteur
Vous pourriez faire quelque chose comme ceci:
Ce n'est pas une bonne idée de modifier l'Objet prototype. Aussi un type de chaîne aura besoin plus que juste \" s'échapper. Il aura besoin de s'échapper de \t\n\r etc.
C'est une parfaitement belle idée de modifier le prototype d'Objet, à condition que vous savez comment code en JavaScript et ne sont pas à l'aide d'une bibliothèque (comme jQuery) qui a explicitement choisi d'être brisé que si vous le faites (pour le bénéfice de l'augmentation de la vitesse).
OriginalL'auteur
Afin de prendre cela un peu plus loin: lorsque vous envoyez quelque chose à travailler sur un récepteur doit obtenir et être capable de travailler sur elle. Si ce bit suivant du code fera l'affaire - adapté de la réponse précédente par Eliran Malka.
Être conscient de l'utilisation de
eval
. Si vous possédez tous les code en cours de transfert: se sentir libre de l'utiliser (même si elle peut aussi avoir des inconvénients). Si vous ne savez pas où la source est à venir à partir de: c'est un no-no.javascript objet tosource stringify eval
OriginalL'auteur
Voir aussi JavaScript mise en forme des données/joli imprimante. Je pense que la routine des exportations en cours de validité, JS format, de sorte qu'il peut être eval pour le récupérer.
[EDIT] en Fait, non! C'est OK pour le vidage rapide mais pas pour de vrai la sérialisation.
J'ai amélioré il, le résultat ci-dessous:
indentValue peut être null, "", " ", "\t" ou quoi que ce soit. Si la valeur est null, pas d'indentation, la sortie d'un plutôt compact résultat (possibilité d'utiliser moins d'espaces...).
J'ai pu utiliser un tableau d'empiler les résultats, puis se joindre à eux, mais à moins d'avoir géant des objets, la concaténation de chaînes devrait être assez bon...
Aussi ne gère pas cyclique références...
OriginalL'auteur
Vous n'avez pas à utiliser
toSource()
; enveloppez-le code doit être sérialisé dans une fonction qui retourne la struct JSON, et l'utilisationfunction#toString()
à la place:Voir un démonstration en direct sur jsFiddle.
OriginalL'auteur
Personne n'a parlé encore, donc, je vais souligner il y a un polyfill disponible pour Mozilla
Object.toSource
à https://github.com/oliver-moran/toSource.jsOriginalL'auteur