2009-09-10 8 views
0

J'ai un script qui crée un objet défini par l'utilisateur comme ceci:Obtenez un objet défini par l'utilisateur en Javascript

obj = new Tree(); 

Cet objet est toujours présent et d'interagir avec l'utilisateur.

Je veux créer un bouton sur la page qui, s'il est pressé, devrait récupérer cet objet, apporter quelques modifications à l'objet et appeler certaines méthodes.

S'il s'agissait d'un objet DOM, j'aurais pu utiliser getElementById() ou getElementByTagName() etc. Cependant, cet objet est créé dans le script et j'ai besoin d'y accéder dans une autre partie à l'intervention de l'utilisateur. De plus, rendre l'objet global n'est pas une option. Est-ce que quelqu'un sait comment cela peut être fait?

+4

Comment cet objet est-il toujours présent et non global? Ai-je manqué quelque chose de subtil, par ex. exposé à travers une fermeture? Il pourrait être utile de mettre une partie du code environnant dans la question –

+0

En regardant votre code ci-dessus, obj serait en fait global car il est déclaré sans le mot-clé var. –

Répondre

1

Vous devrez rendre l'objet accessible à partir de une partie de la fonction de gestion d'événement. Donc, tout en rendant l'objet lui-même global n'est pas une option (ce qui est un bon coup), il y a probablement un objet de premier niveau qui est global à la page pour votre application? Quelque chose comme un objet espace de noms, ou un objet OurPageScript, quelque chose comme ça? Dans ce cas, la définition de l'arbre en tant que propriété de cet objet permettra à celui-ci d'être déréférencé ultérieurement par les gestionnaires d'événements.

Si vous ne pouvez absolument pas avoir toutes les variables qui sont accessibles à partir de n'importe où sur la page, les choses deviennent plus difficiles. Dans ce cas, vous devrez par définition fournir aux gestionnaires d'événements une référence à votre objet (car ils ne pourront pas l'obtenir eux-mêmes). La seule façon que je peux penser à faire est de réécrire les gestionnaires chaque fois que l'objet change; les définissant à une fermeture qui inclut l'objet et invoque le gestionnaire réel avec cet objet en tant que paramètre. Un moyen terme pourrait être de donner l'apparence d'une variable globale en déclarant que tous les gestionnaires d'événements seront invoqués dans un environnement de fermeture où var_tree est défini. De cette façon, vous n'avez pas besoin de muter réellement les gestionnaires, il suffit de les reconditionner dans une fermeture appropriée chaque fois que l'objet a changé.

(je suppose que votre question était uniquement à obtenir l'accès à l'objet;. Une fois que les gestionnaires ont, ils peuvent modifier et appeler des méthodes sans gotchas supplémentaires)

2

Vous pouvez associer des objets à window si vous êtes les définissant dans une portée différente de celle que vous voulez. Cela devrait le rendre "global". Bien que je suggère fortement de fixer votre portée afin que var obj existe là où il le faut, et pas ailleurs.

window.myObj = new Tree(); 
Questions connexes