2010-08-22 9 views
17

Sto provando a chiamare la funzione MyMethod dall'interno di un oggetto ma nessuna delle seguenti sintassi funziona. Ci deve essere un errore molto ovvio sotto ma non riesco a vederlo.Javascript - Come si chiama una funzione all'interno di una classe all'interno di quella 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

Puoi spostare questa parte del tuo codice "this.MyMethod = function() { alert ('Funziona');" al di sopra delle chiamate di metodo a MyMethod? e vedi se questo fa la differenza? – InSane

risposta

21

Ci sono due problemi principali

  1. Il tipo MIME è text/javascript, non text/jscript
  2. si sta definendo il metodo dopo si tenta di chiamare

Quindi:

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

hai messo la chiamata al metodo privato all'interno del costruttore della classe javascript. in quel punto le funzioni non sono ancora inizializzati

ma se si inizializza l'oggetto in questo modo:

var test = new MyObject(); 

e poi fare questo:

test.myMethod(); 

che funzionerà.

-2

Sono sicuro che è possibile definire i metodi ovunque nel file, anche dopo averli richiamati, ma il modo in cui si definisce il metodo è il difetto.

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

Si noti che se si definisce una variabile con una funzione anonima come il suo valore, allora non siete in grado di chiamare la funzione per nome (perché non ne possiede uno). Invece si dovrebbe chiamarlo utilizzando la convenzione

function nameOfTheFunction(arguments) { 
... 
} 

ho trovato il seguente link volontà di essere molto utile:

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

+1

Il difetto non è il modo in cui il metodo è definito, il difetto è quando il metodo è definito. –

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

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

È possibile che questo farà. Oppure puoi semplicemente creare un costruttore e chiamare questo metodo al suo interno. Così, al momento della creazione dell'oggetto si chiamerà this.MyMethod()

1

I 2 modi per definire una funzione di fornire diversi accessibilità

In primo luogo, impostare una proprietà della funzione di genitore, come avviene nella " Una "versione del tuo script qui sotto. Se si esegue questa operazione, la funzione è utilizzabile solo dopo la definizione.

In secondo luogo, definire la funzione con l'approccio classico di "funzione functionName() {...}". Questa definizione è soggetta a "sollevamento", il che significa che la funzione diventa disponibile in tutto l'oggetto genitore, vale a dire anche sopra il luogo in cui è definita. Puoi vedere questo nella versione "B" nell'esempio qui sotto, in base al codice del poster originale.Anche su 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> 

L'uscita è

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Problemi correlati