2011-11-28 20 views
37

me pregunto, ¿qué hace "devolver esto" dentro de una función de JavaScript, cuál es su propósito? suponiendo que tenemos el siguiente código:¿Qué hace "devolver esto" dentro de una función javascript?

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

¿Qué significa "Retorno Este" hacer dentro de una función?

Sé lo que hace el código anterior y para qué sirve esta palabra clave. Simplemente no sé qué hace "devolver esto" dentro de una función.

+1

@ user722756: 'Porque method' se añade a' Function.prototype', 'this' se referirá a una función contra la cual se llamó 'method'. Se supone que esta función debe usarse como un "constructor", porque 'method' está extendiendo el objeto' prototype' de la función. – RightSaidFred

+1

conozco el uso de "esta" palabra clave, simplemente no sé para qué sirve "devolver esto" dentro de una función. – user722756

+7

'return this' se usa para crear una [interfaz fluida] (http://en.wikipedia.org/wiki/Fluent_interface). Vea las respuestas publicadas por @marcioAlmada y @AdamRackis a continuación. –

Respuesta

48

Se refiere a la instancia de objeto en la que se está llamando actualmente al método. Se usa para encadenar. Por ejemplo, se podría hacer algo como esto:

myObject.foo().bar(); 

Desde foo vuelve this (una referencia a myObject), bar será llamado en el objeto también. Esto es lo mismo que hacer

myObject.foo(); 
myObject.bar(); 

Pero requiere menos tipeo.

Aquí es un ejemplo más completo:

function AnimalSounds() {} 

AnimalSounds.prototype.cow = function() { 
    alert("moo"); 
    return this; 
} 

AnimalSounds.prototype.pig = function() { 
    alert("oink"); 
    return this; 
} 

AnimalSounds.prototype.dog = function() { 
    alert("woof"); 
    return this; 
} 

var sounds = new AnimalSounds(); 

sounds.cow(); 
sounds.pig(); 
sounds.dog(); 

sounds.cow().pig().dog(); 

http://jsfiddle.net/jUfdr/

+0

¿Por qué no ilustrar usando el código real ya que extender el 'prototipo' es lo que hace? 'AnimalSounds.method ('cow', func ...) .method ('pig', func ...) .method ('dog', func ...);' – RightSaidFred

10

tl; dr al devolver this desde un método es una forma común de permitir el "encadenamiento" de métodos en conjunto.


this se refiere al contexto actual, y el significado cambia en función de la manera en que usted está invocando una función.

Con invocación de la función, this se refiere al objeto global, incluso si la función está siendo invocado desde un método, y la función pertenece a la misma clase como el método de la invoca. Douglas Crockford ha descrito esto como "error en el diseño del lenguaje" [Crockford 28]

Con invocación de método, this se refiere al objeto sobre el que se está invocando el método .

Con la invocación de solicitud, this se refiere a lo que se le haya asignado al llamar a apply.

Con la invocación del constructor, this se refiere al objeto que es creado para usted detrás de las escenas, que se devuelve cuando las salidas constructor (siempre y cuando no regrese erróneamente su propio objeto de un constructor).

En el ejemplo anterior, se está creando un nuevo método llamado method que le permite añadir funciones de forma dinámica, y devuelve this, lo que permite el encadenamiento.

Por lo que podría hacer algo como:

Car.method("vroom", function(){ alert("vroom"); }) 
    .method("errrk", function() { alert("errrk"); }); 

y así sucesivamente.

11

Significa que el método devolverá el objeto al que pertenece. Esto puede ser útil si desea instrucciones de la cadena de este modo:

MyObject.method1().method2().method3(); 

ejemplo del mundo real: jQuery

$(this).addClass('myClass').hide(); 
+6

+1 Esto es prácticamente lo que jQuery es famoso para. – BoltClock

Cuestiones relacionadas