2011-11-28 25 views
37

Mi chiedo, cosa fa "restituire questo" in una funzione javascript, qual è il suo scopo? supponendo abbiamo il seguente codice:Cosa fa "restituire questo" all'interno di una funzione javascript?

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

Che cosa significa "restituire questo" fare all'interno di una funzione?

So quale codice sopra fa e quale è l'uso della parola chiave "this". Semplicemente non so cosa faccia "restituire" all'interno di una funzione.

+1

@ user722756: Perché 'method' viene aggiunto a' Function.prototype', 'this' farà riferimento a una funzione contro la quale è stato chiamato 'method'. Questa funzione è presumibilmente pensata per essere usata come "costruttore", poiché 'method' sta estendendo l'oggetto' prototipo' della funzione. – RightSaidFred

+1

Conosco l'uso della parola chiave "this" semplicemente non so quale sia l'uso di "return this" all'interno di una funzione. – user722756

+7

'return this' è usato per creare una [fluent interface] (http://en.wikipedia.org/wiki/Fluent_interface). Vedi le risposte pubblicate da @marcioAlmada e @AdamRackis di seguito. –

risposta

48

Si riferisce all'istanza dell'oggetto su cui viene attualmente chiamato il metodo. È usato per concatenare. Ad esempio, si potrebbe fare qualcosa di simile:

myObject.foo().bar(); 

Dal foo rendimenti this (un riferimento a myObject), bar saranno chiamati sull'oggetto troppo. È la stessa cosa che fa

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

Ma richiede meno digitazione.

Ecco un esempio più 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

Perché non illustrare l'utilizzo del codice effettivo poiché l'estensione del 'prototipo' è ciò che fa? 'AnimalSounds.method ('cow', func ...) .method ('pig', func ...) .method ('dog', func ...);' – RightSaidFred

10

tl; dr restituire this da un metodo è un modo comune per consentire "concatenazione" di metodi insieme.


this si riferisce al contesto attuale, e cambia significato a seconda del modo in cui si sta invocando una funzione.

Con la funzione di chiamata, this riferisce all'oggetto globale, anche se la funzione viene richiamata da un metodo, e la funzione appartiene alla stessa classe del metodo invoca. Douglas Crockford ha descritto questo come "errore nella progettazione del linguaggio" [Crockford 28]

Con invocazione di metodi, this riferisce all'oggetto sul quale viene richiamato il metodo .

Con l'invocazione dell'applicazione, this si riferisce a qualsiasi cosa venga impostata quando si chiama apply.

con il costruttore invocazione, this si riferisce all'oggetto che è creato per voi dietro le quinte, che viene restituito quando le uscite costruttore (purché non si misguidedly riportare il proprio oggetto da un costruttore).

Nel tuo esempio sopra, si sta creando un nuovo metodo chiamato method che consente di aggiungere funzioni in modo dinamico, e ritorna this, consentendo in tal modo il concatenamento.

Così si potrebbe fare qualcosa di simile:

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

e così via.

11

Significa che il metodo restituirà l'oggetto a cui appartiene. Questo può essere utile se si desidera istruzioni catena in questo modo:

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

reale esempio del mondo: jQuery

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

+1 Questo è praticamente ciò che jQuery è famoso per. – BoltClock