9
votes

Pourquoi les objets JavaScript n'ont-ils pas une méthode Tojson ()?

comme décrit à http://www.json.org/js.html , JavaScript Les objets peuvent dicter comment ils sont sérialisés par JSON.Stringify () en implémentant une méthode Tojson (). Pour un objet arbitraire, cette méthode n'est pas définie, tandis que les chiffres et les cordes semblent mettre en œuvre la méthode. Je suis curieux - pourquoi les objets n'ont pas de mise en œuvre?

Edit: J'ai initialement mentionné que les tableaux ont cette méthode - ils ne le font pas. Je m'excuse pour la confusion.


1 commentaires

Clarification ultérieure: J'utilise JavaScript sous forme de langage de script (côté serveur) et expérimente avec V8, Tracémonkey et Rhino en tant qu'interprecteurs. Dans chaque cas, '' .tojson est une fonction, tandis que {} .tojson est indéfini.


5 Réponses :


3
votes

Je ne pense pas que c'est le cas que les chiffres, etc. ont des implémentations de Tokson par défaut. Peut-être que vous utilisez un prototype ou un autre cadre?

http://www.w3schools.com/jsref/jsref_obj_number.asp

http://www.w3schools.com/jsref/jsref_obj_array.asp

de http://www.prototypejs.org/learn/json :

codage

JSON de prototype codant légèrement diffère de Crockford's la mise en œuvre telle qu'elle ne s'étend pas Objet.pototype. Ce qui suit Les méthodes sont disponibles: numéro # TOJSON, String # Tojson, Array # Tojson, Hash # tojson, date # tojson et Objet.tojson.


2 commentaires

Rien n'a une implémentation de Tokson par défaut dans la spécification ECMAScript. JSON.ORG/JSON2.JS donne des implémentations par défaut pour les types de listes Jeff, mais ceux-ci ne font que déléguer à ValueOf () .


31.1k Reputilisateur référençant W3Schools ...> :(



-3
votes

Je doute que c'est une raison - les tableaux ne semblent pas les avoir non plus. Voici comment je l'implémenterais:

Array.prototype.toJSON = Object.prototype.toJSON = function() {
  return JSON.stringify(this);
}


2 commentaires

Cela ne causerait-il pas une récursion infinie quelque part comme JSON.Stringify appels tojson (clé) ?


json.stringify ({}); RangeError: taille maximale de la pile d'appels dépassée



0
votes

C'est une norme pour ne pas mettre en œuvre des fonctions sur des objets arbitraires.

Essayez console.log ({}) et vous ne verrez rien.


0 commentaires

6
votes

Ces méthodes que vous mentionnez ont été ajoutées par certains moteurs JavaScript (AFaik les dernières versions de V8 et de TracemonKey Mettez-les):

String.prototype.toJSON
Boolean.prototype.toJSON
Number.prototype.toJSON
Date.prototype.toJSON


1 commentaires

En fait, il existe une motivation valide pour avoir Tojson () au lieu d'utiliser la valeurOf: polymorphisme. Si l'objet implémente TOJSON (), vous pouvez simplement faire n'importe quoi TOLOBJ.TOJSON () et arrêtez de vous inquiéter du type d'objet, ou si la fonction est définie ou non.



7
votes

La raison réelle

tandis que @CMS est correcte, le navigateur fait les les a ajoutés, le point a été entièrement manqué. La raison en est que la spécification JSON est appelle à une méthode optionnelle tojson pour tout objet qui, à son tour, est appelée à sérialiser une structure non normative dans une normative. xxx

un exemple serait une structure de données définie dont la structure est en fait un objet qui a une valeur méthode. Cela permettrait à celui d'écrire ceci.tojson = valeurs; pour fournir le json.stringify méthode la stratégie de sérialisation appropriée.

donc, dans un Nutshell, son pour fournir json.stringify la stratégie correcte pour la sortie de structures alternatives.

espère que cela aide.


0 commentaires