2012-10-09 89 views
6

Una pregunta provocada por la curiosidad, si tengo el siguiente código, ¿cuál es el beneficio (más allá de la simplicidad) de llamar a una propiedad a través de this en lugar de user en el método show_name?Javascript 'este' contra el nombre del objeto

var user = { 

    name : 'John Doe', 

    show_name : function(){ 

     alert(this.name); 

     // OR 

     alert(user.name); 
    } 
}; 
+2

Tenga en cuenta que puede haber otros efectos secundarios con 'this':' user.show_name.call (null); ' – David

Respuesta

10

La diferencia se vuelve obvia, si echa un vistazo a este ejemplo. Crea un segundo objeto y establece el prototipo en consecuencia.

var user = { 

    name : 'John Doe', 

    show_name : function(){ 

     alert(this.name); 

     // OR 

     alert(user.name); 
    } 
}; 

user2 = Object.create(user); 
user2.name = "someone else"; 

user2.show_name(); 

Aquí this.name se refiere a la propiedad del objeto actual name, mientras que user.name siempre se refiere a la name propiedad original.

5

Mediante el uso de this se asegura que después de cambiar el nombre de la variable, por ejemplo, de user a something su código todavía funciona.

Aparte de eso, me imagino que (en algunos navegadores) puede haber un aumento en el rendimiento también, ya que con user.name el buscador debe buscar en contexto fuera de su función mientras usa this.name sticks al contexto actual.

+0

Wow, esa es una respuesta bastante directa. Gracias. – Fluidbyte

+0

¿Cómo hacer referencia a 'esto' frente a 'usuario' garantizar que podamos cambiar 'nombre' a 'algo'. ¿No quieres decir que podemos cambiar 'usuario' a 'algo'? –

+0

@Jacob - buena captura - por supuesto, quise escribir 'user' not' name'. – WTK

3

Puede usar la misma función en varios lugares y tenerla en cuenta en el contexto.

function foo() { 
    alert(this.name); 
} 

var a = { alert: foo, name: "A" }; 
var b = { alert: foo, name: "B" }; 
a.alert(); 
b.alert(); 
0

Si estás haciendo múltiples copias de un objeto, es necesario this por lo que se puede hacer referencia a la obect actual. Usar el nombre haría referencia al objeto predeterminado, no a la copia con la que estás trabajando.

0

En JavaScript this siempre se hace referencia al "owner" de la función que estamos ejecutando, o más bien, al objeto que una función es un método de. Cuando definimos nuestra función fiel doSomething() en una página, su propietario es la página, o más bien, el objeto de ventana (u objeto global) de JavaScript. Sin embargo, una propiedad onclick es propiedad del elemento HTML al que pertenece.

El uso de this es más recomendado que el function name debido a razones obvias.

+0

La afirmación 'esto siempre se refiere al" propietario "de la función' es incorrecta. El valor 'this' de una función se establece por completo por la forma en que se llama a la función (o por * bind *) y se puede establecer en cualquier objeto o cualquier valor en modo estricto ES5. – RobG

0

this aquí se especifica que el objeto es parte del espacio de nombres actual y es accesible dentro del objeto .. permite suponer un cambio de nombre de objeto user-newUser no habrá ninguna dependencia y eliminar cualquier problema de acoplamiento ..

2

Si usa this o el nombre de la función depende de cómo se llamará a la función.

El valor de una función this se establece por la forma en la función se llama o por bind, así que si la función siempre será llamado como método de un objeto adecuado, utilice this. Pero si se puede llamar de otra manera, o this solo debe hacer referencia a un objeto en particular, use bind o el nombre del objeto.

p. Ej.dado el ejemplo OP, tenga en cuenta:

var x = user.showName; 
x(); 

En lo anterior, se llama showName sin establecer su this, por lo que el valor predeterminado es el objeto global y this.name dentro de la función es probable que no sea lo que se espera.

Cambiar el nombre de la función no es un problema particularmente oneroso, dada la disponibilidad de funciones de búsqueda y reemplazo razonablemente potentes en los editores de texto.

Por cierto, esta pregunta se hace con frecuencia. No hay una respuesta "correcta", solo consejos sobre cómo tomar decisiones en ciertos casos.

Cuestiones relacionadas