J'utilise SWFAddress pour une liaison profonde mon site ( Lien vers SWFADDRESS ). J'aime briser du code dans des classes, donc j'ai une structure principale similaire à celle-ci:
function SomeClass() { // This adds the this.handleChange() function to the // SWFAddress event listener this.initializeSWFA = function() { // SWFAddress variable is instantiated in SWFAddress javascript file // so I can use it here SWFAddress.addEventListener(SWFAddressEvent.CHANGE, someFunc); } // SWFAddress suppose to call this function this.handleChange= function(evt) { // Some code here } } // Instantiate the SomeClass var someVar = new SomeClass(); function someFunc(evt) { someVar.handleChange(evt); } someVar.initializeSWFA();
3 Réponses :
J'ai bien peur de ne pas pouvoir identifier votre problème, mais je dirais que cela a quelque chose à voir avec votre utilisation de une clarification supplémentaire de la question de Miki (désormais supprimée) d'une autre réponse, Concernant comment Il y a deux cas pour la manière dont pour les invocations de fonction régulières, alors nous avons également le cas lorsqu'il est invoqué avec le Il existe également des moyens d'invoquer une fonction avec un ensemble explicitement défini qui appellera la fonction initialewfa avec SWFAddress code>. La façon dont vous êtes structurant
soméclass code> et ses méthodes est totalement valide, contrairement à ce que certaines autres réponses indiquent ici.
ceci code> fonctionne: strong> p>
ce code> se comporte; Fonctions et fonctions régulières invoquées avec le
Nouveau code> -Opérator. P>
Ceci fait référence à l'objet à gauche du point (lâche Parler): par exemple, lors de l'écriture
quelqueevar.initialisézizeswfa () code>,
Ce code> se référera à
personnifiant code>. Lorsque vous appelez une fonction sans le point,
ceci code> se référera à l'objet global. Une fonction peut être attribuée d'un objet à un autre et donc
ceci code> sera décalé, comme ceci: p>
Nouveau code> -Oprateur. Dans ce cas,
nouveau code> créera un nouvel objet pour vous et
Ce code> se référera à cet objet. P>
ceci code>, à l'aide de l'appel code> code> -function: p>
anuméro code> comme
ceci code> et transmettez-le également les paramètres
arg1 code>,
arg2 code>, etc. Notez que
onevar code > est sorti de l'équation dans ce cas. p> p>
Désolé, je ne suis pas un expert en JavaScript. Vous pouvez donc ajouter appel () code> à n'importe quelle fonction?
Pas besoin de s'excuser, c'est ce que ce site est pour :) et oui, vous pouvez ajouter appel code> à n'importe quelle fonction. Une fonction de JavaScript est un objet, comme des chiffres et de la chaîne, etc. Et juste comme des chaînes a des fonctions telles que
indexof code>,
concat code> et
remplacer code>, les fonctions ont aussi des fonctions :)
Merci pour l'explication concernant ceci code>
Je pense que la meilleure chose à faire est d'arrêter de penser à une soméclasse comme une classe em>. JavaScript n'a pas de cours. Il utilise le héritage prototypique. Ce que je ne vais pas aller trop profondément ici. Essentiellement, cela signifie que vous avez juste des objets. Et si vous souhaitez créer un autre objet comme le premier, vous utilisez l'attribut objet.Prototype pour le faire. P> Donc, si vous voulez faire ce que vous essayez de (en supposant que la SWFADDRESS fonctionne comme le plus JavaScript), procédez comme suit. P> à ce stade, vous pouvez appeler quelque part: p> si vous voulez Pour créer un objet que vous pouvez hériter d'autres objets d'essayer ce qui suit. p> var baseObject = function(){};
baseObject.prototype.handleChange = function(){
// Your code here
}
baseObject.prototype.initializeSWFA = function(){
SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange);
}
var someVar = new baseObject();
someVar.initializeSWFA();
Comment faire référence à la baseObject dans le code de la méthode de prototype?
Vous pouvez simplement appeler baseObject.hangerlechange ou baseObject.Initializesswfa directement. Peut-être que je vais mal comprendre votre question?
Votre structure de classe est parfaitement valide. Cependant, si votre fonction Ceci est Que se passe-t-il: p> Pour vous déplacer, vous devez simplement utiliser une fonction anonyme qui capture les variables dans le cadre de la classe. Vous pouvez appeler le gestionnaire avec le contexte correct de cette fonction anonyme: p> une explication de Le J'aimerais aussi jeter mon raisonnement rapide aussi, que vous trouverez utile. N'oubliez pas que JavaScript n'a pas de "cours" comme des langues telles que Java Do. Dans ces langues, une «méthode» d'une classe n'appartient qu'à cette classe (ou pourrait être héritée). En JavaScript, toutefois, il n'y a que des objets et des propriétés d'objet, qui peuvent arriver à des fonctions. Ces fonctions sont des agents libres - ils ne sont pas appartiennent em> à un objet ou à un autre, comme des cordes ou des chiffres. Par exemple: p> dans ce cas, quel objet fait handlechange () code> utilise le mot clé code>, en attendant
quelquevar code>, c'est là que votre problème réside.
swfaddress.addeventlistener (swfaddressevent.changer, this.handlechange); code> Références correctement la fonction de gestionnaire dans la classe. SWFADDRESS CACHES qui fonctionne à une variable
f code> jusqu'à ce que l'événement soit expédié. Li>
f code>. Bien que la référence à la fonction soit préservée, la référence au contexte ou
ceci code> n'est pas. Par conséquent,
ceci code> par défaut sur
fenêtre code>. Li>
ol>
Ceci code>, comme demandé par l'OP: ## p>
Ce mot-clé code> peut être expliqué de différentes manières: prendre une lecture de tout d'abord Cet article sur la portée , puis Article sur JavaScript orienté objet P>
myMethod code> appartient à? Il n'y a pas de reponse; Il pourrait être soit
a code> ou
b code>. Par conséquent,
a.mymethod code> est simplement une référence à une fonction, dissociée du "contexte" ou de l'objet parent. Par conséquent,
Ce code> n'a aucune signification, sauf si elle est
A.MymeThod () code> ou
B.MyMethod () Code> , et donc par défaut à
fenêtre code> lorsqu'il est appelé d'autre manière. C'est pour la même raison qu'il n'y a pas de telles choses telles que un
parent code> ou
Super code> en javascript. P> p>
Connaissez-vous de tout article qui décrit cela en détail pourquoi ceci code> serait par défaut à
fenêtre code>. Je pensais que
ceci.handlechange code> lorsqu'il est stocké sur Var
f code> sera évalué à un emplacement de mémoire ou si JavaScript fait référence à des variables, puis lorsque SWFADDRESS appelle
F < / Code>, il appellera l'adresse de la mémoire de
this.handlechange code>.
Merci. Votre réponse à jour et les articles ont été très utiles.
Merci pour votre réponse claire. Je me rencontrais aussi ce problème.
Étant donné que votre question dans les commentaires à la réponse maintenant supprimée est également supprimée, j'ai étendu ma vieille réponse avec une réponse. J'espère que ça a du sens.