2011-02-09 9 views
7

Estoy desarrollando un framework web para node.js. aquí está el código;var vs esto en el objeto 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 

}; 

¿Debo cambiar todo el var a este, así:

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 

}; 

Cualquier comentario?

+3

Esta es una diferencia bastante fundamental. ¿Estás seguro de que sabes qué es "esto" y qué variables locales son? – delnan

+0

Tengo el fondo C++, Javascript me parece extraño. –

+0

En ese caso, ¿está desarrollando un marco web solo por diversión o aprendizaje? Los marcos como el expreso pueden ser una mejor opción para su código de producción mientras está aprendiendo. – 7zark7

Respuesta

13

Agregue propiedades a this cuando desee que las propiedades persistan con la vida del objeto en cuestión. Use var para variables locales.

edición — como Bergi señala en un comentario, las variables declaradas con var No necesariamente desaparecen al regresar de una invocación de la función. Son, y permanecen, directamente accesibles solo para el código en el ámbito en el que fueron declarados, y en ámbitos léxicamente anidados.

+0

Observe que las variables locales pueden persistir con la vida del objeto también si se hace referencia desde un cierre. – Bergi

1

Depende de lo que quiera hacer.

Si declara las variables con var, entonces son locales para la función y no se puede acceder al exterior.

Si asigna las variables a this, se establecerán como propiedades del objeto de contexto al que se llama la función.

Por lo tanto, si p. si escribe:

var obj = new Router(); 

continuación obj tendrá todas las variables como propiedades y ellos pueden cambiado. Si llama

somobject.Router() 

entonces todas las variables se establecen como propiedades de someobject.

1

Puede pensar en propiedades colgadas de this tipo de variables de instancia similares en otros idiomas (más o menos).

Parece que está creando una función de constructor y probablemente agregará algunos métodos de prototipo. Si ese es el caso, y necesita acceder al routes, lo tiene, pero no path.

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

Usando var en el constructor se utiliza generalmente para la variable privada durante el uso de this. se utiliza para la variable pública.

Ejemplo con this.:

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

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

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

Ejemplo con var:

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

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

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

Considere cambiar el último r.foo a r._foo para realmente hacer su punto ... – ODaniel

+0

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