2010-08-22 6 views
17

J'essaie d'appeler la fonction MyMethod à partir d'un objet mais aucune des syntaxes ci-dessous ne fonctionne. Il doit y avoir une erreur vraiment évidente ci-dessous mais je ne peux pas le voir.Javascript - Comment appelez-vous une fonction dans une classe à partir de cette classe?

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 

    <script type="text/jscript"> 

    function MyObject() { 

     //how do I get one of these to work?? 
     this.MyMethod; //does not work 
     this.MyMethod(); //does not work either 
     MyMethod(); //does not work either 

     this.MyMethod = function() { 
     alert('It works'); 
     } 
    } 

    var test = new MyObject(); 

    </script> 

</head> 
<body> 

</body> 
</html> 
+1

Pouvez-vous déplacer cette partie de votre code "this.MyMethod = function() { alert ('Il fonctionne');" au-dessus des appels de méthode à MyMethod? et voir si cela fait une différence? – InSane

Répondre

21

Il y a deux problèmes principaux

  1. Le type MIME est text/javascript, pas text/jscript
  2. Vous définissez la méthode après vous essayez de l'appeler

Ainsi:

function MyObject() { 
    this.MyMethod = function() { 
     alert('It works'); 
    } 
    this.MyMethod(); //should now work 
    } 

    var test = new MyObject(); 
+0

http://ejohn.org/apps/learn/#6 – sova

2

vous avez mis l'appel à la méthode privée dans le constructeur de la classe javascript. en ce moment-là les fonctions ne sont pas encore initialisés

mais si vous initialisez l'objet comme ceci:

var test = new MyObject(); 

et faites ceci:

test.myMethod(); 

cela fonctionnera.

-2

Je suis sûr que vous pouvez définir des méthodes n'importe où dans le fichier, même après les avoir appelées, mais leur façon de définir la méthode est la faille.

http://ejohn.org/apps/learn/#5

Notez que si vous définissez une variable avec une fonction anonyme comme sa valeur, alors vous n'êtes pas en mesure d'appeler la fonction par son nom (car il ne possède pas). Au lieu de cela, vous devez le nommer en utilisant la convention

function nameOfTheFunction(arguments) { 
... 
} 

Je trouve la volonté de lien suivant pour être très utile:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/

+1

La faille n'est pas la façon dont la méthode est définie, la faille est lorsque la méthode est définie. –

0
var MyObject = function MyObject() { 
     this.MyMethod = function() { 
     alert('It works'); 
     } } 

var test = new MyObject(); test.MyMethod(); 

Le fera ci-dessus. Ou vous pouvez simplement créer un constructeur et appeler cette méthode à l'intérieur. Ainsi, au moment de la création d'objets, il appellera this.MyMethod()

1

Les 2 façons de définir une fonction de fournir différentes accessibilités

En premier lieu, la mise en une propriété de la fonction mère, comme cela se fait dans le " Une "version de votre script ci-dessous. Si vous faites cela, la fonction est seulement utilisable après vous donnez la définition. Deuxièmement, définissant la fonction avec l'approche classique de "la fonction functionName() {...}". Cette définition subit un "levage", ce qui signifie que la fonction devient disponible dans tout l'objet parent, c'est-à-dire même au-dessus du lieu où elle est définie. Vous pouvez le voir dans la version "B" de l'exemple ci-dessous, basé sur le code de l'affiche originale.Également sur https://jsfiddle.net/dnL4j30u/

<script> 
    function MyObject() { 

    MyMethod(); 

    this.MyMethod = function() { 
     console.log('It works A'); 
    } 

    this.MyMethod(); 

    MyMethod(); 

    function MyMethod() { 
     console.log('It works B'); 
    } 

    } 
    var test = new MyObject(); 
</script> 

La sortie est

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Questions connexes