2010-08-22 9 views
17

Próbuję wywołać funkcję MyMethod z obiektu, ale żadna z poniższych składni nie działa. Musi być naprawdę oczywisty błąd poniżej, ale nie widzę go.JavaScript - Jak wywołujesz funkcję wewnątrz klasy z poziomu tej klasy?

<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

można przenieść tę część kodu "this.MyMethod = function() { alert ('To działa');" nad wywołań metod do MyMethod? i zobaczyć, czy to robi różnicę? – InSane

Odpowiedz

21

Istnieją dwa główne problemy

  1. Typ MIME jest text/javascript nie text/jscript
  2. definiowania metody po spróbować nazwać

Tak więc:

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

Położyłeś wywołanie metody prywatnej wewnątrz konstruktora klasy javascript. w tym momencie funkcje nie są jeszcze zainicjowany

ale jeśli zainicjować obiekt tak:

var test = new MyObject(); 

a następnie to zrobić:

test.myMethod(); 

będzie działać.

-2

Jestem pewien, że możesz definiować metody w dowolnym miejscu pliku, nawet po ich wywołaniu, ale sposób, w jaki określasz metodę, jest wadą.

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

Zauważ, że jeśli zdefiniować zmienną z anonimowej funkcji jako jego wartość to nie jesteś w stanie wywołać funkcję przez nazwę (bo nie masz). Zamiast tego należy go wymienić stosując konwencję

function nameOfTheFunction(arguments) { 
... 
} 

znalazłem następujący link będzie się bardzo przydatne:

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

+1

Wada nie jest sposobem, w jaki metoda jest zdefiniowana, wada występuje wtedy, gdy zdefiniowana jest metoda. –

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

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

Powyższy zrobi. Lub możesz po prostu utworzyć konstruktora i wywołać tę metodę wewnątrz tego. Więc w momencie tworzenia obiektu będzie zadzwonić this.MyMethod()

1

W 2 sposoby definiowania funkcji zapewniają różne Ułatwienia dostępu

Pierwsze ustawienie jej własności funkcji nadrzędnej, jak to się dzieje w " "Wersja twojego skryptu poniżej. Jeśli to zrobisz, funkcja będzie użyta tylko pod warunkiem, że podasz definicję.

Po drugie, definiowanie funkcji z klasycznym podejściem funkcji "function functionName() {...}". Definicja ta podlega "podnoszeniu", co oznacza, że ​​funkcja staje się dostępna w obiekcie nadrzędnym, tj. Nawet ponad miejscem, w którym została zdefiniowana. Możesz to zobaczyć w wersji "B" w poniższym przykładzie, w oparciu o oryginalny kod plakatu.Również na 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> 

Wyjście jest

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Powiązane problemy