2010-08-22 21 views
17

Estoy tratando de llamar a la función MyMethod desde dentro de un objeto, pero no funciona ninguna de las siguientes sintaxis. Debe haber un error muy obvio a continuación, pero no puedo verlo.Javascript: ¿cómo se llama a una función dentro de una clase dentro de esa clase?

<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

¿Puede mover esta parte de su código "this.MyMethod = function() { alert ('Funciona');" por encima de las llamadas a métodos a MyMethod? y ver si eso hace la diferencia? – InSane

Respuesta

21

Hay dos problemas principales

  1. El tipo MIME es text/javascript, no text/jscript
  2. está definiendo el método después intenta llamar

Por lo tanto:

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

has puesto la llamada al método privado dentro del constructor de la clase javascript. en ese momento las funciones aún no se inicializan

pero si inicializar el objeto de esta manera:

var test = new MyObject(); 

y luego hacer esto:

test.myMethod(); 

que va a funcionar.

-2

Estoy bastante seguro de que puede definir métodos en cualquier parte del archivo, incluso después de llamarlos, pero la forma en que está definiendo el método es la falla.

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

Tenga en cuenta que si se define una variable con una función anónima como su valor, entonces no es capaz de llamar a la función por su nombre (ya que no tiene uno). En su lugar debe nombrarlo utilizando la convención

function nameOfTheFunction(arguments) { 
... 
} 

He encontrado el siguiente enlace voluntad de ser muy útil:

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

+1

La falla no es la forma en que se define el método, la falla es cuando se define el método. –

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

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

Lo anterior hará. O simplemente puede crear un constructor y llamar a este método dentro de eso. Así que en el momento de la creación de objetos se llamará this.MyMethod()

1

Las 2 formas de definir una función proporcionar diferentes accesibilidades

En primer lugar, el establecimiento de una propiedad de la función madre, como se hace en el " Una "versión de tu script a continuación. Si hace esto, la función solo es utilizable después de le da la definición.

En segundo lugar, definir la función con el enfoque clásico de "función nombre de función() {...}". Esta definición se somete a "elevación", lo que significa que la función está disponible en todo el objeto principal, es decir, incluso encima del lugar donde está definida. Puede ver esto en la versión "B" en el ejemplo siguiente, basado en el código del póster original.También en 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 salida es

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Cuestiones relacionadas