2010-08-22 20 views
17

Ich versuche, die Funktion MyMethod innerhalb eines Objekts aufzurufen, aber keine der folgenden Syntax funktioniert. Es muss ein wirklich offensichtlicher Fehler unten sein, aber ich kann es nicht sehen.Javascript - Wie rufen Sie eine Funktion innerhalb einer Klasse innerhalb dieser Klasse auf?

<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

Können Sie diesen Teil des Codes bewegen "this.MyMethod = function() { alert ('Es funktioniert');" über den Methodenaufrufe zu MyMethod? und sehen, ob das einen Unterschied macht? – InSane

Antwort

21

Es gibt zwei Hauptprobleme

  1. Der MIME-Typ ist text/javascript, nicht text/jscript
  2. Sie definieren die Methode nach Sie versuchen, es zu nennen

Also:

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

Sie haben den Aufruf der privaten Methode in den Konstruktor der JavaScript-Klasse eingefügt. in diesem Punkt sind die Funktionen noch nicht

initialisiert, aber wenn Sie das Objekt wie so initialisieren:

var test = new MyObject(); 

und dann dies tun:

test.myMethod(); 

es funktionieren wird.

-2

Ich bin mir ziemlich sicher, dass Sie Methoden irgendwo in der Datei definieren können, auch nachdem Sie sie aufgerufen haben, aber sie definieren die Methode ist der Fehler.

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

Beachten Sie, dass, wenn Sie eine Variable mit einer anonymen Funktion definieren, wie es Wert ist, dann Sie nicht in der Lage sind, die Funktion von Namen zu nennen (weil es keinen hat). Stattdessen sollten Sie nennen es die Konvention

function nameOfTheFunction(arguments) { 
... 
} 

ich mit den folgenden Link gelangen gefunden als sehr nützlich:

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

+1

Der Fehler ist nicht die Art, wie die Methode definiert ist, der Fehler ist, wenn die Methode definiert ist. –

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

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

Die oben tun. Oder Sie können einfach einen Konstruktor erstellen und diese Methode innerhalb dieses Konstruktors aufrufen. So zum Zeitpunkt der Objekterstellung wird es nennen this.MyMethod()

1

Die 2 Möglichkeiten zur Definition einer Funktion unterschiedliche Erreichbarkeiten bieten

Erstens ist es eine Eigenschaft der übergeordneten Funktion Einstellung, wie in der durchgeführt wird " Eine "Version Ihres Skripts" unten. Wenn Sie dies tun, ist die Funktion nur verwendbar nach geben Sie die Definition.

Zweitens, definieren Sie die Funktion mit dem klassischen Ansatz "Funktion Funktionsname() {...}". Diese Definition erfährt ein "Hochziehen", was bedeutet, dass die Funktion im gesamten Hauptobjekt verfügbar wird, d. H. Sogar über dem definierten Platz. Sie können dies in der "B" -Version im folgenden Beispiel sehen, basierend auf dem Code des ursprünglichen Posters.Auch auf 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> 

Der Ausgang ist

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Verwandte Themen