2009-07-17 13 views
8

In OO Javascript, quando devo usare la parola chiave this?Quando utilizzare questo in OO javascript?

Inoltre, se voglio chiamare un metodo di una classe da un altro metodo della stessa classe, dovrei usare this o solo il nome della funzione? E.g è corretto?

function Foo() 
{ 
    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    this.bar(); //should I use this.bar() or just bar()? 
    } 
} 
+1

Non è possibile utilizzare solo 'bar()', perché 'this' non è mai implicita in JavaScript (dal momento che non è proprio un linguaggio orientato agli oggetti corretta.)' Bar() 'sarebbe prima guardare per una variabile definita come 'bar' nella funzione' this.baz', quindi cercherebbe una variabile definita come 'bar' nella funzione' Foo' e infine guarderebbe nell'ambito globale, e in caso contrario sarebbe lanciare un errore – Blixt

+1

È importante imparare il sistema prototipo JavaScript, quindi è una grande domanda da porre. Ma se avessi intenzione di fare un grande programma OO in JavaScript, userei Joose.js o Js.Class. – Nosredna

+0

Perché è stato downvoted? –

risposta

6

Quando si tratta di JavaScript "object-oriented", ecco una bella guida Mark Dickinson qui su SO collegato a: Private Members in JavaScript. Entra nei dettagli di alcune altre cose di cui non hai veramente bisogno ora, ma una volta capito come funziona JavaScript, vedrai che è molto diverso dal tuo linguaggio ordinario orientato agli oggetti quando si tratta di cose come quello che lo significa this .

Direi che nel suo caso, si dovrebbe assolutamente utilizzare this, ma forse le funzioni dovrebbe essere nella prototype parte della tua "classe" (questo evita ridefinendo la funzione ogni volta che viene creata una nuova istanza.)

+0

Ho creato un modello semplice per le classi che sembra molto simile a quello che Douglas Crawford ha nel suo articolo (che ho collegato). Se l'aiuto del codice aiuta, puoi sempre dare un'occhiata a questo: http://blixt.org/js /classes.js (file raw) http://blixt.org/js#project/js-classes (con evidenziazione della sintassi) – Blixt

+1

Cosa intendi per "parte prototipo della classe"? –

+1

Le funzioni hanno una proprietà 'prototype' che viene utilizzata come prototipo per gli oggetti creati quando si chiama la funzione con la parola chiave' new'. Se imposti 'Foo.prototype.bar = function() {...};', allora tutti gli oggetti creati con 'new Foo()' avranno una proprietà 'bar' che fa riferimento alla funzione' Foo.prototype.bar' . – Blixt

0

In questo caso particolare, è meglio usare una variabile auto-riferimento al posto di this per evitare confusione e mal di testa all'interno delle funzioni.

function Foo() 
{ 
    var self = this; 

    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    self.bar(); 
    } 
} 

La ragione per questo è perché dato che tutto in JavaScript è un oggetto, la parola this all'interno di una funzione si riferisce alla funzione principale. Definendo una variabile in un determinato ambito, la tua garanzia è che la variabile manterrà il suo ambito.

+0

Quali sono i motivi? –

+0

Lo fai in modo che lo scope sia ovvio. Molte persone usano "quello" invece di "sé". – Nosredna

+0

Oppure puoi fare $ questo. –

0

Solo per sottolineare ed enfatizzare la precedente risposta di @ tj111 ti suggerisco di leggere this. Per capire meglio la funzione scoping.

0

La versione corretta è quella che non dà un errore quando si tenta di chiamare la funzione. Se ometti this, riceverai un'eccezione ReferenceError.