2011-10-10 14 views
7

Dopo anni di creazione di applicazioni che utilizzano l'ereditarietà prototipale in JavaScript, ho iniziato ad esplorare utilizzando l'ereditarietà parassitaria. Nonostante la sua insidia principale - almeno per me - di creare potenzialmente più copie di metodi in memoria, come si crea una gerarchia di oggetti, ho constatato che risuona veramente con me con la sua semplicità e il fatto che "nuovo" è reso inutile. Tuttavia, sono bloccato su cosa succede con "questo". La maggior parte degli esempi che ho visto on-line solo graffiare la superficie che mostra come implementare l'ereditarietà parassitaria in questo modo:A cosa fa riferimento questo in JavaScript Parasitic Inheritance?

function foo() { 
     return { 
      method1 : function() {...} 
     } 
    } 

    function bar() { 
     var that = foo(); 
     that.method2 = function() { 
      //is "this" pointing to bar()? 
     } 
     return that; 
    } 

Come ho chiesto nel commento nell'oggetto bar(), significa "questo" si riferiscono al bar () o è lo scopo di questo relegato a method2?

Grazie!

risposta

3

La prova pratica indica che this riferisce correttamente all'oggetto restituito da bar:

function foo() { 
    return { 
     method1 : function() { return "spam" } 
    } 
} 

function bar() { 
    var that = foo(); 
    that.method2 = function() { 
     return this.method1(); 
    } 
    return that; 
} 

var b = bar(); 
b.method2(); // "spam" 
+0

Bello. Grazie! Ora posso andare avanti. È un po 'un salto concettuale, avendo fatto l'eredità prototipale per così tanto tempo. L'eredità parassitaria è familiare, ma abbastanza diversa in cui sono un po 'scomodo, ma è una buona cosa! :) –

1

Il this context variable in method2() saranno vincolati all'oggetto, che viene restituito dalla funzione di costruzione foo() pseudo. Ogni funzione (contesto) ha un limite this, il valore dalla variabile di contesto, dipende dall'invocazione dal metodo stesso.

Ad esempio, chiamando una funzione come proprietà da un oggetto (come fai tu lì) imposterà lo this variable esattamente su quell'oggetto. Quando si chiama subito una funzione, il suo this è associato allo global object in ES3 e al suo null in ES5.

ci sono altri metodi e le parole chiave che possono cambiare il valore da this. Come new, .bind(), .call() e .apply(). Ma ancora, nel tuo particolare frammento qui, this sarà legato all'oggetto che è memorizzato in that.

+0

Spiegazione del pensiero, ma che cos'è ES3 ed ES5? – CapelliC