8
votes

Comment faire référence à une fonction de la méthode de la classe JavaScript

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();


1 commentaires

É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.


3 Réponses :


1
votes

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 SWFAddress . La façon dont vous êtes structurant soméclass et ses méthodes est totalement valide, contrairement à ce que certaines autres réponses indiquent ici.

une clarification supplémentaire de la question de Miki (désormais supprimée) d'une autre réponse, Concernant comment ceci fonctionne:

Il y a deux cas pour la manière dont ce se comporte; Fonctions et fonctions régulières invoquées avec le Nouveau -Opérator.

pour les invocations de fonction régulières, Ceci fait référence à l'objet à gauche du point (lâche Parler): par exemple, lors de l'écriture quelqueevar.initialisézizeswfa () , Ce se référera à personnifiant . Lorsque vous appelez une fonction sans le point, ceci se référera à l'objet global. Une fonction peut être attribuée d'un objet à un autre et donc ceci sera décalé, comme ceci: xxx

alors nous avons également le cas lorsqu'il est invoqué avec le Nouveau -Oprateur. Dans ce cas, nouveau créera un nouvel objet pour vous et Ce se référera à cet objet.

Il existe également des moyens d'invoquer une fonction avec un ensemble explicitement défini ceci , à l'aide de l'appel -function: xxx

qui appellera la fonction initialewfa avec anuméro comme ceci et transmettez-le également les paramètres arg1 , arg2 , etc. Notez que onevar est sorti de l'équation dans ce cas.


3 commentaires

Désolé, je ne suis pas un expert en JavaScript. Vous pouvez donc ajouter appel () à n'importe quelle fonction?


Pas besoin de s'excuser, c'est ce que ce site est pour :) et oui, vous pouvez ajouter appel à 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 , concat et remplacer , les fonctions ont aussi des fonctions :)


Merci pour l'explication concernant ceci



2
votes

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> xxx pré>

à ce stade, vous pouvez appeler quelque part: p> xxx pré>

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();


2 commentaires

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?



11
votes

Votre structure de classe est parfaitement valide. Cependant, si votre fonction handlechange () utilise le mot clé , en attendant quelquevar , c'est là que votre problème réside.

Ceci est Que se passe-t-il:

  1. swfaddress.addeventlistener (swfaddressevent.changer, this.handlechange); Références correctement la fonction de gestionnaire dans la classe. SWFADDRESS CACHES qui fonctionne à une variable f jusqu'à ce que l'événement soit expédié.
  2. Lorsque l'événement est expédié, SWFADDRESS appelle f . Bien que la référence à la fonction soit préservée, la référence au contexte ou ceci n'est pas. Par conséquent, ceci par défaut sur fenêtre .

    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: xxx

    une explication de Ceci , comme demandé par l'OP: ##

    Le Ce mot-clé 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

    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 à un objet ou à un autre, comme des cordes ou des chiffres. Par exemple: xxx

    dans ce cas, quel objet fait myMethod appartient à? Il n'y a pas de reponse; Il pourrait être soit a ou b . Par conséquent, a.mymethod est simplement une référence à une fonction, dissociée du "contexte" ou de l'objet parent. Par conséquent, Ce n'a aucune signification, sauf si elle est appelée explicitement à l'aide de A.MymeThod () ou B.MyMethod () , et donc par défaut à fenêtre 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 ou Super en javascript.


3 commentaires

Connaissez-vous de tout article qui décrit cela en détail pourquoi ceci serait par défaut à fenêtre . Je pensais que ceci.handlechange lorsqu'il est stocké sur Var f 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 .


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.