2011-02-09 17 views
7

Sto sviluppando un framework web per node.js. ecco il codice;var vs this in oggetto Javascript

function Router(request, response) { 
     this.routes = {}; 

     var parse = require('url').parse; 

     var path = parse(request.url).pathname, 
      reqRoutes = this.routes[request.method], 
      reqRoutesLen = reqRoutes.length; 

     ..... // more code 

}; 

Devo cambiare tutto il var a questo, in questo modo:

function Router(request, response) { 
     this.routes = {}; 

     this.parse = require('url').parse; 

     this.path = this.parse(request.url).pathname; 
     this.reqRoutes = this.routes[request.method]; 
     this.reqRoutesLen = this.reqRoutes.length; 

     ..... // more code 

}; 

Eventuali commenti?

+3

Questa è una differenza abbastanza fondamentale. Sei sicuro di sapere che cosa è questo? E quali sono le variabili locali? – delnan

+0

Ho lo sfondo C++, Javascript mi ​​sembra strano. –

+0

In questo caso, stai sviluppando un framework web solo per divertimento o apprendimento? I framework come express potrebbero essere una scelta migliore per il tuo codice di produzione mentre stai imparando. – 7zark7

risposta

13

Aggiungere proprietà a this quando si desidera che le proprietà persistano con la vita dell'oggetto in questione. Utilizzare var per le variabili locali.

modificare — come nota Bergi in un commento, variabili dichiarate con var Non necessariamente svaniscono al ritorno da una funzione di invocazione. Sono, e rimangono, direttamente accessibili solo al codice nello scope in cui sono stati dichiarati, e in ambiti lessicamente annidati.

+0

Si noti che le variabili locali possono persistere con la vita del oggetto anche se riferito da una chiusura. – Bergi

1

Questo dipende da ciò che si desidera fare.

Se si dichiarano le variabili con var, esse sono locali alla funzione e non è possibile accedere all'esterno.

Se si assegnano le variabili a this, verranno impostate come proprietà dell'oggetto contesto su cui viene eseguita la funzione.

Quindi se ad es. se si scrive:

var obj = new Router(); 

poi obj avranno tutte le variabili come proprietà e si possono cambiare. Se si chiama

somobject.Router() 

allora tutte le variabili verranno impostate come proprietà di someobject.

1

Si può pensare a proprietà sospese da this una sorta di variabili di istanza simili in altre lingue (sorta di).

Sembra che tu stia creando una funzione di costruzione e probabilmente aggiungerai alcuni metodi di prototipazione. Se questo è il caso, e hai bisogno di accedere a routes, ce l'hai, ma non a path.

Router.prototype = { 
    doSomething: function(){ 
    this.routes; // available 
    path; // not available 
    } 
} 
0

Utilizzando var nel costruttore di solito è usato per la variabile privata durante l'utilizzo this. viene utilizzato per la variabile pubblica.

Esempio con this.:

function Router() { 
    this.foo = "bar"; 

    this.foobar = function() { 
     return this.foo; 
    } 
} 

var r = new Router(); 
r.foo // Accessible 

Esempio con var:

function Router() { 
    var _foo = "bar"; 

    this.foobar = function() { 
     return _foo; 
    } 
} 

var r = new Router(); 
r._foo // Not accessible 
+1

Considera di modificare l'ultimo r.foo in r._foo per rendere effettivamente il tuo punto ... – ODaniel

+0

r.foo ---> r._foo done. – radarbob