2011-03-01 9 views
6

Tengo una clase de JavaScript:¿A qué se refiere `this`?

function Person(n){ 
    // ... 
} 

fuera de la clase, Tengo el siguiente código:

Person.prototype.shower = function(){ this.dirtFactor=2 } 

Lo que lo hace this en el código anterior se refieren a? ¿Se refiere a prototype, oa la clase Person?

Respuesta

1

bien, fundamentos primero: cuando se escribe function Person(o) { ... }, que son no declarar una clase - JavaScript no basa la clase, pero objeto basa. Esta declaración simplemente declara una función (que por cierto, también son objetos).

A continuación, cuando se crea un objeto como éste:

var mellon = new Person('Mellon'); 

va a crear un objeto, cuyo constructor (de clases) es Person.

Ahora, lea esto con cuidado: desde 's constructor es Person, todos los métodos en Person' s prototype estarán disponibles en el objeto.

Así que si usted escribe:

Person.prototype.shower = function(){ this.dirtFactor=2 } 

entonces el método mellon.shower() estarán disponibles.

Recomiendo pasar por Mozilla's intro to OOP in Javascript para obtener más detalles sobre este tema.


Así que para responder a su pregunta: this se refiere al objeto con el que se invoca el método shower. En el caso anterior, sería .

1

Se refiere a la instancia de la persona

Así que cuando se hace una
var Mike = new Person();

entonces este es Mike

Ejemplo

<input type="text" id="field" value="Bla" /> 
<script> 
document.getElementById('field').onfocus=function() { 
    alert(this.value) 
} 
</script> 

alertará al valor de la campo la función está asignada a

1

Se reffers a una instancia de la clase Person

 
    var instance = new Person(...); 

    instance.shower(); // Here will be this.dirtFactor assigned to instance.dirtFactor 
4

El significado de this depende de cómo se llamada a la función, no cómo usted lo define.

Asumiendo que hacer algo como:

var bob = new Person('whatever n is'); 
bob.shower(); 

Entonces this habrá bob (que será una instancia de Person).

+0

+1, pero para ser claros, 'this' se refiere a lo que estaba antes del' .' cuando se llama. Si se llama sin un '.', entonces' this' se establece de forma predeterminada en 'window' /' global'. –

+1

Que se puede probar reemplazando la función de ducha con 'function() {console.log (this); } ' – kim3er

+0

@ Box9 'this' se refiere al contexto actual. 'this' se referirá al objeto' window' (en un navegador) de forma predeterminada. El contexto cambia a medida que agrega recintos/funciones. – kim3er

1

Esto se refiere al objeto sobre el que se llama shower. En concreto, es muy probable que terminan haciendo

p = new Person(n); 

Esto ejecutará la función Person y crear un nuevo objeto, vacío que será accesible como this en el constructor. A ese objeto se le dará un enlace a Person.prototype y cualquier referencia de atributo que falle en p se verá en Person.prototype para ver si se encuentra allí.

Si se llama en p, usando p.shower(), entonces this volverá a p. El punto es que no hay instancias y clases en javascript. Person.prototype es un objeto y todos los objetos que están construidos por Person compartirán una referencia al mismo.

prototipos Eliminando todos juntos, sólo pueden hacer

person = {'shower': function() { 
    this.dirtFactor = 2; } 
} 

person.shower(); 
console.log(person.dirtFactor); 

y verá que this todavía se refiere al objeto sobre el que llamó al método.

Cuestiones relacionadas