2009-07-17 21 views
8

En Javascript OO, ¿cuándo debería usar la palabra clave this?¿Cuándo usar esto en javascript OO?

Además, si quiero llamar a un método de una clase desde otro método de la misma clase, ¿debo usar this o solo el nombre de la función? Por ejemplo, ¿es esto correcto?

function Foo() 
{ 
    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    this.bar(); //should I use this.bar() or just bar()? 
    } 
} 
+1

no puede utilizar simplemente 'bar()' porque 'this' nunca está implícita en JavaScript (ya que no es realmente un lenguaje orientado a objetos apropiada.)' Bar() 'se buscará primero para una variable definida como 'bar' en la función' this.baz', entonces buscaría una variable definida como 'bar' en la función' Foo' y finalmente se vería en el alcance global, y en su defecto se vería lanzar un error – Blixt

+1

Es importante aprender el sistema de prototipos de JavaScript, por lo que es una gran pregunta para hacer. Pero si fuera a hacer un gran programa OO en JavaScript, usaría Joose.js o Js.Class. – Nosredna

+0

¿Por qué fue esto downvoted? –

Respuesta

6

Cuando se trata de JavaScript "orientado a objetos", aquí hay una buena guía de Mark Dickinson aquí en SO vinculada a: Private Members in JavaScript. Entra en detalles sobre algunas otras cosas que realmente no necesita ahora, pero una vez que comprenda cómo funciona JavaScript, verá que es bastante diferente de su lenguaje ordinario orientado a objetos cuando se trata de cosas como lo que realmente significa this .

Yo diría que, en su caso, que sin duda debe usar this, pero tal vez sus funciones debe estar en la parte prototype de su "clase" (esto evita la redefinición de la función cada vez que se crea una nueva instancia.)

+0

Hice una plantilla simple para clases que parece ser muy similar a lo que Douglas Crawford tiene en su artículo (que yo vinculé). Si ver el código ayuda, siempre puede ver eso: http://blixt.org/js /classes.js (archivo sin formato) http://blixt.org/js#project/js-classes (con resaltado de sintaxis) – Blixt

+1

¿qué quiere decir con el 'prototipo de la clase'? –

+1

Las funciones tienen una propiedad 'prototype' que se usa como prototipo de los objetos creados cuando se llama a la función con la palabra clave' new'. Si configura 'Foo.prototype.bar = function() {...};', todos los objetos creados con 'new Foo()' tendrán una propiedad 'bar' que hace referencia a la función' Foo.prototype.bar' . – Blixt

0

En este caso particular, lo mejor es utilizar una variable de referencia a sí misma en el lugar de this para evitar confusión y dolores de cabeza dentro de funciones.

function Foo() 
{ 
    var self = this; 

    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    self.bar(); 
    } 
} 

La razón de ello es porque ya que todo en Javascript es un objeto, el this palabra clave dentro de una función se refiere a la función de los padres. Al definir una variable en un cierto alcance, su garantía de esa variable mantendrá su alcance.

+0

¿Cuáles son las razones? –

+0

Lo haces así que el alcance es obvio. Mucha gente usa "eso" en lugar de "yo". – Nosredna

+0

O puede hacer $ esto. –

0

Solo para enfatizar y sentir empatía con la respuesta anterior de @ tj111 Le sugiero que lea this. Para comprender mejor el alcance de las funciones.

0

La versión correcta es la que no da un error cuando intenta llamar a la función. Si omite this obtendrá una excepción ReferenceError.

Cuestiones relacionadas