Objet Javascript obtenir le code comme une chaîne de caractères
Tout d'abord, je suis désolé si c'est un doublon, mais à chaque fois j'ai googlé pour 'objet' et 'code' j'ai eu tutoriel pages.
Je veux savoir si il existe un moyen facile pour obtenir le code associé à un objet. Quelque chose comme
function A(){
this.name = 'Kaiser Sauze';
}
a = new A();
console.log(a.displayCode());
//OUTPUT
"function A(){ this.name = 'Kaiser Sauze';}"
Je veux être en mesure d'afficher le code, le modifier et le rechargement de la fonction, le tout dans le navigateur. Je voulais savoir si il y avait une certaine façon de le faire, ou si je dois amorcer la pompe en faisant quelque chose comme ceci:
function A(){
this.name = 'Kaiser Sauze';
this.code = "function A(){ this.name = 'Kaiser Sauze';}"
}
puis, à chaque fois, l'utilisateur télécharge l'éditeur de texte pour afficher this.code
- je connecter le onchange de mettre à jour this.code
.
MODIFIER
s'avère yankee a suggéré une solution simple à ce
function A(x){
this.x = x ;
}
console.log(A.toString());
//OUTPUT
"function A(x){
this.x = x ;
}"
mais dans ma mise en œuvre de la variable 'x' peut être une fonction (en fait un complexe d'objets avec des variables, des fonctions et des sous-objets que je mélange à l'aide d'un appel à l'dojo.mixin), donc ce que je veux vraiment, c'est de connaître le code lorsqu'il est instancié, quelque chose comme ça
function A(x){
this.x = x ;
}
var a = new A(function(){/*DO SOMETHING*/);
console.log(a.toString());
//OUTPUT
"var a = new A(function(){/*DO SOMETHING*/);"
mais, comme la plupart d'entre vous le savez déjà, tout ce qui est sortie est quelque chose comme "Objet". J'ai presque trouvé un moyen de contourner cela, en mettant l'initialisation en fonction de la façon
function A(x){
this.x = x ;
}
function _A(){
var a = new A(function(){/*DO SOMETHING*/);
}
console.log(_A.toString());
//OUTPUT
"function _A(){
var a = new A(function(){/*DO SOMETHING*/);
}"
mais qui prête à confusion, et puis, je dois y aller et de commencer l'analyse de la chaîne dont je ne veux pas faire.
EDIT: La raison pour laquelle je vous demande à tous de ce est b/c je veux faire un code qui est à la fois de façon dynamique exécutable et très modulaire. Je fais affaire avec la toile. Je veux que l'utilisateur puisse cliquer sur un, par exemple, un rectangle, d'afficher son code, et de le modifier puis de charger/exécuter. J'ai une série de règles, mais, fondamentalement, j'ai une classe de forme et de tout ce qui définit cette forme (couleur, transparence, les remplissages, contours...) a pour obtenir transmis en tant que paramètre à l'objet cosntructor, quelque chose comme:
rect = new Shape({color : 'rgba(0,0,0,1)' ,
x : 0 ,
y : 0 ,
w : 100 ,
h : 100 ,
draw : function() {ctx.fillStyle = this.color;
ctx.fillRect(this.x,this.y,this.w,this.h);
}
});
De cette façon, le code est automatiquement modulaire, je n'ai pas à vous soucier de la couleur définie en haut de la page, puis la hauteur étant défini à moitié chemin en bas de la page, et ainsi de suite. Maintenant, la seule chose dont j'ai besoin est d'une certaine manière, passer comme paramètre, l'ensemble au-dessus de la chaîne de la représentation de l'initialisation. Je pourrais l'insérer dans une fonction et l'appel de toString sur ça, comme
function wrapper(){
rect = new Shape({color : 'rgba(0,0,0,1)' ,
x : 0 ,
y : 0 ,
w : 100 ,
h : 100 ,
draw : function() {ctx.fillStyle = this.color;
ctx.fillRect(this.x,this.y,this.w,this.h);
},
code : wrapper.toString()
});
}
mais alors il y a deux problèmes. 1) j'ai pour supprimer manuellement les function wrapper()
et de fuite }
ainsi que le déplacement de chaque ligne à gauche par un onglet. 2) il n'y a aucune garantie que l'utilisateur n'oubliez pas d'inclure la fonction wrapper car il est totalement inutile pour les fins de l'établissement. Je suis en train de réfléchir à un moyen où le wrapper semble naturel, mais je ne peux pas penser à tout. Mais encore une fois je n'ai pas dormi dans plus de 30 heures.
Je ne me souviens jamais comment l'écrire, donc quand je donne mon numéro pour les dames, je vais par Rolo Tomasi 😉
OriginalL'auteur puk | 2011-07-05
Vous devez vous connecter pour publier un commentaire.
OK... Revoir encore une fois... je pense que c'est ce que vous voulez ;-).
aussi, je pourrais juste mettre l'initialisation de l'objet à l'intérieur d'une fonction et ensuite appeler à la chaîne.
Je pense que je vais modifier la question pour mettre à jour tout le monde qui est intéressé. Aussi, pour une raison quelconque, quand je le fais AU yankee il n'apparaît pas.
qu'est-ce que? ;-).
Lorsque vous répondez à quelqu'un que vous êtes supposé utiliser " au " signe. Comme l'utilisateur À hotmail.com. Mais il n'a pas de travail ces deux dernière fois quand j'ai essayé d'écrire AU yankee
OriginalL'auteur yankee
Modifier: ajout d'impression.
Vous pourriez
JSON.stringify()
l'argument du constructeur, si elle est JSON-compatible. Voici unetoString()
fonction qui s'appuie sur cette idée, mais avec légèrement d'une version généralisée deJSON.stringify()
qui accepte stringifying fonctions:La sortie est:
J'ai édité ma question encore une fois. Je vous explique pourquoi j'en ai besoin, et pourquoi j'ai besoin non seulement de la structure de l'objet, mais la structure du code lui-même. Donc, j'ai besoin, pour des raisons d'esthétique, les tabulations, les espaces et les caractères de nouvelle ligne. Sinon, l'utilisateur va taper quelque chose, l'enregistrer et puis, quand ils le rouvrir, tout d'un coup tout le code a été simplifié à une seule ligne seulement
Il n'y a aucun moyen que vous pouvez retrouver les espaces, les tabulations et les retours à la ligne, à moins que le code est enregistré comme une chaîne de caractères en premier lieu (ce qui peut effectivement être la meilleure voie à suivre). J'ai édité ma réponse pour améliorer l'esthétique de la sortie. Cependant, cette
toString()
est en fait re-indentation avec mon tiret style (quatre de l'espace tiret, pas d'espace avant ':'...), bien que le code a été à l'origine de l'entrée à l'aide de votre style. Vous pouvez bien évidemment modifiertoString()
pour s'adapter à votre style.Je me trompe peut-être, mais si vous appelez
toString()
sur une fonction, il vous donnera une copie exacte de la mise en œuvre, y compris les espaces/tabulationsJe ne suis pas sûr que ce comportement est spécifié, il peut être dépendant de l'implémentation. Au moins Firefox 3.6 et Qt 4.5 (QtScript) donner une version reformatée de votre fonction.
OriginalL'auteur Edgar Bonet
Voici une autre solution qui pourrait fonctionner (à l'aide de yankee exemple). Je ne suis toutefois pas sûr de ce qui se passe si Une existe déjà? Peut-être que vous devriez faire un "delete ();" avant de l'enregistrer dans le stockage.
OriginalL'auteur Roy
Voici mon violon pour que:
http://jsfiddle.net/DanielDZC/vXrQf/
Qui permettra d'afficher les fonctions, propriétés, etc. mais chacun d'eux séparément. vous pouvez l'ajuster de sorte que chaque boucle est ajouter des trucs à une chaîne, au lieu de les alerter. en fait, permettez-moi de le changer...
Daniel, merci pour le jsfiddle. Il a certainement clarifier les choses 🙂
Est-ce que vous avez besoin?
Je vois comment ça pourrait fonctionner, mais je veux préserver la manière dont l'utilisateur écrit le code (différent de l'espacement, la taille de tabulation...), je vais juste utiliser les zones de texte et mise à jour du code et enregistrer une copie de ce code dans le code (assez chouette si je peux me permettre)
OriginalL'auteur Daniel Gruszczyk
Je ne peux pas croire que personne n'a suggéré cela (je m'excuse si cette réponse est quelque part entre les lignes). Je ne pense pas que ça, car au moment de son développement, tout mon travail a été infoclient. Tous j'ai vraiment besoin de faire est de charger le code une fois avec de l'Ajax en javascript. Une fois qu'il est chargé et un objet créé, je le charger à nouveau comme une chaîne de caractères et l'assigner à une variable dans l'objet.
OriginalL'auteur puk
Dirait que vous êtes à la recherche pour la Réflexion et/ou de l'Introspection de soutien. Je ne suis pas sûr de l'endroit où les autres grands moteurs sont à cet égard mais SpiderMonkey est Analyseur de l'API a récemment été référencé dans un article sur L'Extension de l'Introspection avec Chrome Privilèges.
est-il une raison À mon(@) les signes ne s'affichent pas? Je ne peux plus répondre à des utilisateurs spécifiques dans le formulaire de @ user (@user). A la syntaxe de changement, ou je n'ai accidentellement changer ma configuration? Pour exemple, j'ai essayé de commencer mon commentaire précédent avec "@psema4", mais je ne vois pas là
merci pour le lien psema4. Je vais l'utiliser pour les non objet des sections (ie. les classes et à l'ensemble de scripts)
OriginalL'auteur psema4
Je ne vous recommande pas de l'utiliser sur un serveur de production, uniquement pour les tests et le débogage, mais il existe une méthode nommé
toSource()
qui renvoie la source d'une fonction comme une Chaîne de caractères:Sorties:
Disponible sur JS Fiddle: http://jsfiddle.net/IQAndreas/dP453/1/
Noter que Mozilla a marqué cette méthode comme non-standard (qui, si vous lire les détails signifie "ne fonctionne que sous FireFox").
OriginalL'auteur IQAndreas