J'ai une "bibliothèque" d'objets que je veux charger à la volée d'une base de données. Chaque objet est livré avec ses propres fonctions spéciales appelées à des heures spécifiques en fonction du type d'objets. Idéalement, j'aimerais pouvoir faire cela, même s'il a été souligné que cela ne fonctionne pas: la chaîne Quel est le moyen "droit" de stocker une fonction à appeler comme ça. Je sais que Calling Eval peut être très dangereux pendant l'exécution, permettant aux attaques du XSS et à ce que ce soit. Je veux vraiment éviter une instruction de commutation massive ou la chargement gonflée de fonctions supplémentaires. J'aimerais aussi que la solution soit aussi concise que possible. P> Cela ne peut pas être la première fois que cela est arrivé. ; / p> Merci pour votre aide. P> p> "myobj" code> est transmis Mon programme un peu, mais il suffit d'accéder à certaines valeurs de l'objet à la fois, et dans certaines circonstances, une fonction spécifique doit être exécutée. Le problème est que je regarde des centaines, et éventuellement des milliers d'objets potentiels pouvant exister avec des fonctions variables. P>
7 Réponses :
Une meilleure approche peut être de sérialiser les propriétés de l'objet lorsque vous "dormez", et "éveillez" l'objet en faisant rétablir ses propriétés à une nouvelle instance de l'objet avec les méthodes appropriées définies. P>
Je ne dors pas vraiment l'objet. Je veux fondamentalement avoir une tonne d'objets très similaires que je peux charger de ma base de données que tous ont des identifiants uniques et tous ont des fonctions assez uniques. Si je dois créer une fonction pour chaque objet, je me réveille en fonction de son identifiant, je vais toujours avoir une déclaration de commutation massive, ce que j'essaie d'éviter. :::: ::: Peut-être ce que je cherche est un moyen de charger de manière dynamique une classe?
Utilisez simplement EVAL pour recréer la fonction après le chargement en tant que chaîne. Donc, si vous désérialisez un objet MyOBJ code> de JSON, et que vous avez une propriété: eval("myObj.func = " + myObj.func);
Donc, c'est bien à utiliser aussi longtemps que je suis prudent. : / - :: :: :: :::::::rieux: j'ai vu beaucoup de gens impliquant qu'il ne devrait jamais être utilisé, comme s'il s'agissait d'aller.
Hein, je suis sûr que beaucoup de gens pensent que JSONP est mauvais aussi. Toute la bande fonctionne sur des hacks. Il n'y a vraiment pas d'autre moyen d'accomplir ce que vous voulez faire, du moins que je peux penser.
Je vais l'utiliser comme modèle de travail pour l'instant, mais je vais attendre de voir si quelqu'un renverse une meilleure idée qui me tient hors du réservoir de requin
@Kirk BTW, goto code> s utilisé malade i> est une mauvaise idée. D'eux-mêmes, ils ne sont qu'un outil - et à peu près le seul moyen de branche en montage. Beaucoup de gens se répètent simplement à Dogma sans la comprendre.
Changer le prototype de l'objet est une moitié de pensée que j'ai.
Vous avez votre bibliothèque comme p> Vous avez un objet (appelons-nous Il theobj code>) que vous connaissez est un myobj code> (en raison d'une chaîne peut-être? Propriété?) P> theObj.function(...);
Je n'utilise pas de fonctions obsolètes quand il n'y a aucune raison de le faire. :: :::::: utiliser php pour insérer automatiquement dans le JavaScript est séduisant. Je devrai réfléchir dessus. J'oublie parfois que PHP est le premier passage et me permet de manipuler non seulement la page, mais aussi le code.
propriété, pas fonction, mais oui. Il y a des moyens bénis de fitzing avec le prototype qui n'impliquent pas __ proto __ code>. Si cela vous fait se tortiller, les php'ing dans la page et l'EVAL sera beaucoup mieux :-)
Qu'est-ce que vous faites avec c'est juste bien. Cependant, si j'étais vous, pour la lisibilité et la rangée, je préférerais que la fonction soit créée à l'extérieur et que vous l'avez simplement attribuée à votre clé d'objet. P>
Vous n'avez pas besoin d'évaluation ici. Au lieu de cela, faites-le de cette façon chaque fois que vous souhaitez accéder à la fonction stockée - p>
bibliothèque.myobj.function () p>
Élaborer s'il vous plaît: "Je préférerais avoir la fonction créée à l'extérieur et l'avoir simplement assigné à votre clé d'objet."
@Kirk var bibliothèque = {myobj: {nom: "myobj", type: "mytype",}}; bibliothèque.myobjc.function = fonction () {alerte (123455)}; bibliothèque.myobjc.function (); // Si vous utilisez EVAL dans votre code, votre code est non seulement vulnérable à une attaque malveillante, mais vous ne pourrez également pas obscorer votre bibliothèque à l'aide d'Obfuscator / minificateur standard (par exemple, la fermeture de Google)
juste mes deux cents. p>
Pouvez-vous donner un exemple de quel type de code irait dans une telle fonction? J'ai du mal à essayer d'imaginer. Merci.
Vous ne pouvez vraiment vraiment sérialiser qu'un fichier entier avec Ce n'est pas exactement sécurisé, mais pour cela, vous devez utiliser quelque chose comme vm2 et Censorsie de valeur (que je travaille sur) pour les éviter d'appeler Eval () et de posséder votre machine ou tout le réseau . P> nécessite des appels code>. Si vous le faites, vous pouvez créer un module, des exportations et un module.exports, evalez le fichier avec une fonction qui l'entoure et attrape le module.exports hors de celui-ci. P>
Il n'y a pas de bonne façon de le faire, car ce n'est pas généralement une bonne idée.
Cependant, si vous voulez le faire de toute façon, vous pouvez simplement étendre le prototype de fonction avec un .tojson code > Méthode. P> Function.prototype.toJSON = function(){ return this.toString(); }
Il n'y a pas de bonne façon. C'est une mauvaise idée à plat.
À moins que ce soit ce qu'il doit faire, auquel cas c'est un problème, il essaie de résoudre de la meilleure façon. Yeesh.